Песочница

Синтаксис, который раскрывается в базовые формы

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

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

LISPEX
(let* ((x 6) (y (+ x 1))) (* x y))

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

ВЫВОД
42

let* сначала связывает x, затем использует его значение для вычисления y. Перед выполнением Лиспекс преобразует эти связывания во вложенные формы let.

LISPEX
(let ((x 6))
  (let ((y (+ x 1)))
    (* x y)))

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

ВЫВОД
42

Запустите оба примера на площадке. Каждый возвращает 42.

Что делает нормализация

Форма — это единица синтаксиса программы. Производная форма — сокращённая запись, которую Лиспекс преобразует в основные формы. Это преобразование называется нормализацией.

При преобразовании создаются внутренние имена, которые не могут конфликтовать с именами вашей программы. Также используются скрытые встроенные операции. Например, ваше определение eqv? не меняет способ сравнения данных в case. Такая защита имён называется гигиеной.

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

Во что превращается сокращённая форма

Записанная формаПреобразование в основные формыПравило вычисления
cond / caseвложенные формы if с новыми временными именами; case использует скрытый eqv?хвостовая позиция последнего выражения каждой ветви сохраняется; cond => отвергается
and / orвложенные формы if, останавливающие вычисление, когда результат известенпоследний операнд сохраняет хвостовую позицию
when / unlessif с begin для тела или с values без аргументовноль значений, если тело пропущено
именованный let / doцикл letrec с защитой от конфликтов имёнрекурсивный вызов находится в хвостовой позиции
quasiquotequote и скрытые операции создания данныхотдельный unquote вне квазицитирования вызывает статическую ошибку E1xx

В case datum — отдельный элемент данных, например число, символ или список. Данные ветвей сравниваются через eqv? без вычисления как выражений.

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

Встроенные правила синтаксиса

Лиспекс применяет встроенные правила преобразования до вычисления. define-syntax, синтаксические объекты и произвольное пользовательское раскрытие отвергаются. Пропуск ветви при выполнении не отменяет проверку её синтаксиса.

Куда дальше

Получившийся синтаксис описан в справочнике Базовые формы синтаксиса. Выбрать между if, cond и case поможет раздел Как писать условия.