Песочница

Данные и составные значения

Выберите список, пару, вектор или байтовый вектор и узнайте, как читать и изменять их содержимое.

Используйте список для последовательности, пару для двух связанных значений, а вектор для доступа к элементам по индексу. Здесь вы узнаете, как создавать эти значения и какие из них можно изменять.

Определите тип значения

Вставьте каждый пример в песочницу и запустите его.

LISPEX
(list (vector? #(1 2)) (bytevector? #u8(1 2)) (pair? (cons 1 2)))

Результат

ВЫВОД
(#t #t #t)

Три процедуры проверяют, является ли значение вектором, байтовым вектором или парой. Каждая возвращает #t, то есть истину.

Пары, векторы, строки и байтовые векторы называют составными значениями. Они хранят другие значения, знаки или байты.

Создайте список или пару

LISPEX
(list (cons 1 (list 2 3)) (cons 1 2) (list? (cons 1 2)))

Результат

ВЫВОД
((1 2 3) (1 . 2) #f)

cons создаёт пару из двух значений. Если второе значение — список, первое добавляется в его начало. Так, (cons 1 (list 2 3)) даёт (1 2 3).

Правильный список — это пустой список () или цепочка пар, которая заканчивается на (). Пара (cons 1 2) заканчивается значением 2. Она выводится как (1 . 2), а list? возвращает для неё #f.

Цепочка, которая замыкается в цикл, тоже не является правильным списком. Сравнение циклических структур через equal? завершается.

Выберите значение

ЗначениеПримерНазначение и изменяемость
булево значение, число, знак, символ#t, 42, 2/3, 2.0, #\a, 'nameотдельные значения, называемые атомами
пустой список'()завершает правильный список
список / пара(list 1 2), (cons 1 2)последовательность / два связанных значения; пары неизменяемы
строка"hello"текст; неизменяема
вектор, созданный процедурой(vector 1 2)элементы доступны по индексу; их можно заменить через vector-set!
литерал вектора#(1 2)элементы доступны по индексу; неизменяем
байтовый вектор#u8(1 2)блок байтов заданной длины; неизменяем
процедура(lambda (x) x)вызываемое значение; тело нельзя прочитать как данные
выходное продолжениесоздаётся через call/ccвозвращает управление в сохранённую точку; см. Продолжения

Неизменяемость означает, что сохранённое содержимое нельзя заменить. Цитированные составные значения тоже неизменяемы. Для замены элементов создайте вектор через vector или получите изменяемую копию через vector-copy.

Через set! переменная может получить другое значение. При этом меняется значение в переменной, а не содержимое прежнего значения.

Заполните шаблон данных

Квазицитирование позволяет написать шаблон и подставить вычисленные значения в выбранные позиции.

LISPEX
(define x 7)
(define ys (list 2 3))

`(a ,x ,@ys b)

Результат

ВЫВОД
(a 7 2 3 b)

Обратная кавычка начинает шаблон. ,x подставляет значение x. ,@ys вставляет элементы списка ys один за другим.

Вставка элементов через ,@ работает внутри квазицитированного списка или вектора. Вне квазицитирования или на месте одного значения она вызывает E130.

Поддерживаемые типы

Текущий профиль языка — набор поддерживаемых возможностей — включает значения из таблицы. Комплексные числа, порты, записи и изменяемые пары или строки не поддерживаются.

Внутренние результаты вычисления, сигналы управления и метки переменных, ожидающих инициализации, остаются внутри среды выполнения. Программа не может хранить их как обычные значения.

Связанные страницы

В разделе Сравнение значений разобраны сравнение содержимого и проверка ссылок на один объект. Создание, чтение и изменение значений описаны в разделе Процедуры списков и составных значений.