Песочница

Производные формы

cond, case, and, or, when, unless, let*, именованный let, do, quasiquote и guard встроены в нормализатор, а не написаны как пользовательские макросы.

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

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

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

OUTPUT
42

Как рассуждать

  • Раскрытие использует свежие имена и скрытые встроенные операции, поэтому затенение имени в вашем коде не меняет смысл раскрытия.
  • Нормализация сохраняет определённые хвостовые позиции и диагностику исходника.
  • guard остаётся закреплённой в ядре конструкцией для перехватываемых ошибок, а не общей системой макросов.

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

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

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

define-syntax, синтаксические объекты и произвольное расширение отвергаются.

Куда дальше

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

Основные формы · Условия и производные формы