Проверьте запуском
LISPEX
((lambda (x) (if #t x 0)) 42)Наблюдаемый результат
OUTPUT
42Как рассуждать
- У
ifобязательна ветвьelse, аbeginи тела процедур сохраняют порядок слева направо. lambdaподдерживает фиксированные и точечные параметры.set!меняет существующую ячейку, аdefineсоздаёт или обновляет верхнеуровневую ячейку.quoteвозвращает неизменяемые литеральные данные, и программа не обрабатывает их элементы как выражения.moduleзаписывается как(module имя (export имя ...) (import имя ...) тело ...)и допустим только на верхнем уровне. Внутри другой формы это E130. Заголовочные клаузыexportиimportидут перед телом.- Заголовок
moduleпроверяется и отбрасывается, а тело раскрывается наружу. Пространства имён он не создаёт. Не ждите от него сокрытия. Именно поэтому(f 21)ниже вызывается снаружи модуля.
LISPEX
(module doubling
(export twice)
(define (twice x) (* x 2)))
(twice 21)Наблюдаемый результат
OUTPUT
42Контракты форм
| Форма | Число аргументов / вычисление | Результат или ошибка |
|---|---|---|
quote | один datum, элементы не вычисляются | неизменяемые данные |
if | условие, истинная и ложная ветви, сначала условие | значения выбранной ветви. E320, если условие даёт не одно значение |
lambda | параметры и 1..N форм тела | замыкание. E302 при неверном числе аргументов |
set! | имя и правая часть с одним значением | ноль значений. E303, если имя не связано |
let / letrec | список связываний и 1..N форм тела | значения последней формы тела. E321 при раннем чтении letrec |
module | имя, 0..2 заголовочные клаузы, 1..N форм тела | тело, раскрытое наружу. E130 везде, кроме верхнего уровня |
Частая ошибка
Удобные сокращённые формы перечислены в справочнике производных форм.
Куда дальше
Сокращения, которые нормализуются в эти формы, собраны на странице производных форм, а порядок вычисления подвыражений разобран в руководстве.