Когда это нужно
Выбирайте наименьшую форму, которая выражает задачу. Атом подходит для одного факта, правильный список для последовательности, вектор для изменяемых индексных ячеек, а байтовый вектор для блока байтов заданной длины.
Проверьте запуском
(list (vector? #(1 2)) (bytevector? #u8(1 2)) (pair? (cons 1 2)))Наблюдаемый результат
(#t #t #t)Разбор примера
Пример применяет три предиката к трём разным составным значениям. Каждый конструктор создаёт ожидаемый вид, поэтому получается список из трёх истинных значений.
cons соединяет два значения в одну пару. Поставьте справа список, и он станет длиннее на один элемент, поэтому (cons 1 (list 2 3)) даёт (1 2 3). Поставьте туда что-то другое, и получится пара, которая списком не является, поэтому (cons 1 2) даёт (1 . 2). pair? спрашивает, является ли значение такой парой.
Когда форма почти целиком задана и заполнить нужно лишь несколько мест, берите квазицитирование. Шаблон пишется после обратной кавычки, а на месте значения ставится запятая. Одна запятая подставляет в это место одно значение, а ,@ раскрывает список сразу на несколько мест.
(define x 7)
(define ys (list 2 3))
`(a ,x ,@ys b)Наблюдаемый результат
(a 7 2 3 b),@ работает только там, где стоят элементы списка. В любом другом месте сама по себе она даёт E130.
Как рассуждать
- В текущем профиле пары, строки и байтовые векторы неизменяемы, а векторы и лексические ячейки изменяемы.
- Цитированные составные данные неизменяемы, а конструкторы создают объекты выполнения с документированными правилами идентичности.
- Неправильные и циклические структуры отличны от правильных списков, и глубокое равенство завершается на циклах.
Быстрый выбор
| Семейство | Типичная запись | Изменяемость в текущем профиле |
|---|---|---|
| атомы | #t, 42, 2/3, name, #\\a | не применимо |
| список / пара | (list 1 2), (cons 1 2) | неизменяемы |
| строка | "hello" | неизменяема |
| вектор | #(1 2) или (vector 1 2) | ячейки изменяемы |
| байтовый вектор | #u8(1 2) | неизменяем |
| процедура | (lambda (x) x) | вызываемое значение, тело которого не является данными |
Частая ошибка
Комплексные числа, порты, записи и изменяемые пары или строки вне текущего профиля.
Текущие границы
- Внутренние исходы, сигналы и внутренние маркеры неинициализированных ячеек не являются гостевыми значениями.
Куда дальше
Конструкторы и доступ находятся в справочнике списков и агрегатов, а различие идентичности и структуры разбирает глава о равенстве.