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