Песочница

Данные и составные типы

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

Когда это нужно

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

Проверьте запуском

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

Наблюдаемый результат

OUTPUT
(#t #t #t)

Разбор примера

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

cons соединяет два значения в одну пару. Поставьте справа список, и он станет длиннее на один элемент, поэтому (cons 1 (list 2 3)) даёт (1 2 3). Поставьте туда что-то другое, и получится пара, которая списком не является, поэтому (cons 1 2) даёт (1 . 2). pair? спрашивает, является ли значение такой парой.

Когда форма почти целиком задана и заполнить нужно лишь несколько мест, берите квазицитирование. Шаблон пишется после обратной кавычки, а на месте значения ставится запятая. Одна запятая подставляет в это место одно значение, а ,@ раскрывает список сразу на несколько мест.

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

`(a ,x ,@ys b)

Наблюдаемый результат

OUTPUT
(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)вызываемое значение, тело которого не является данными

Частая ошибка

Комплексные числа, порты, записи и изменяемые пары или строки вне текущего профиля.

Текущие границы

  • Внутренние исходы, сигналы и внутренние маркеры неинициализированных ячеек не являются гостевыми значениями.

Куда дальше

Конструкторы и доступ находятся в справочнике списков и агрегатов, а различие идентичности и структуры разбирает глава о равенстве.

Списки и агрегаты · Равенство