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