Используйте список для последовательности, пару для двух связанных значений, а вектор для доступа к элементам по индексу. Здесь вы узнаете, как создавать эти значения и какие из них можно изменять.
Определите тип значения
Вставьте каждый пример в песочницу и запустите его.
(list (vector? #(1 2)) (bytevector? #u8(1 2)) (pair? (cons 1 2)))Результат
(#t #t #t)Три процедуры проверяют, является ли значение вектором, байтовым вектором или парой. Каждая возвращает #t, то есть истину.
Пары, векторы, строки и байтовые векторы называют составными значениями. Они хранят другие значения, знаки или байты.
Создайте список или пару
(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! переменная может получить другое значение. При этом меняется значение в переменной, а не содержимое прежнего значения.
Заполните шаблон данных
Квазицитирование позволяет написать шаблон и подставить вычисленные значения в выбранные позиции.
(define x 7)
(define ys (list 2 3))
`(a ,x ,@ys b)Результат
(a 7 2 3 b)Обратная кавычка начинает шаблон. ,x подставляет значение x. ,@ys вставляет элементы списка ys один за другим.
Вставка элементов через ,@ работает внутри квазицитированного списка или вектора. Вне квазицитирования или на месте одного значения она вызывает E130.
Поддерживаемые типы
Текущий профиль языка — набор поддерживаемых возможностей — включает значения из таблицы. Комплексные числа, порты, записи и изменяемые пары или строки не поддерживаются.
Внутренние результаты вычисления, сигналы управления и метки переменных, ожидающих инициализации, остаются внутри среды выполнения. Программа не может хранить их как обычные значения.
Связанные страницы
В разделе Сравнение значений разобраны сравнение содержимого и проверка ссылок на один объект. Создание, чтение и изменение значений описаны в разделе Процедуры списков и составных значений.