Песочница

Базовые формы синтаксиса

Синтаксис, порядок вычисления, результаты и ошибки основных форм.

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

LISPEX
((lambda (x) (if #t x 0)) 42)

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

ВЫВОД
42

lambda создаёт процедуру с параметром x. При вызове x связывается с 42. if проверяет #t и вычисляет только x, поэтому результат равен 42. Другая ветвь, 0, не вычисляется.

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

Как читать основные формы

Форма — это единица синтаксиса программы. Основные формы Лиспекс вычисляет напрямую. К ним относятся цитирование, ссылка на переменную, if, последовательное выполнение, lambda, вызов, присваивание, определение, лексическое связывание и формы управления.

  • Для if нужны условие и обе ветви. begin и тела процедур выполняются слева направо.
  • lambda принимает список с фиксированным числом параметров или список с точкой для остальных аргументов.
  • set! меняет существующую ячейку — место хранения значения, связанное с именем. define создаёт или обновляет ячейку верхнего уровня.
  • quote возвращает неизменяемые данные без вычисления их элементов. Например, '(+ 1 2) возвращает список (+ 1 2).

Datum — отдельный элемент данных, например число, символ или список. Этот термин используется в строке quote таблицы ниже.

Определение модуля на верхнем уровне

LISPEX
(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

Замыкание — процедура, которая сохраняет доступ к связываниям в месте своего создания. О параметрах читайте в разделе Процедуры, о ячейках и области видимости — в разделе Связывания. При лексическом связывании область поиска имени определяется структурой программы.

Куда дальше

Перед выполнением Лиспекс преобразует сокращённую запись в основные формы. Этот шаг называется нормализацией. Преобразования описаны в разделе Синтаксис, который раскрывается в базовые формы. Порядок выполнения частей программы объясняет раздел Выражения и порядок вычисления.