Введение

Lispkit Lisp — это лексически-скопируемый, чисто функциональный поднабор языка Lisp («Чистый Lisp»), разработанный как платформа для тестирования концепций функционального программирования. Он впервые использовался для ранних экспериментов с отложенным вычислением. Реализация на базе машины SECD, написанная на варианте ALGOL, была опубликована разработчиком Питером Хендерсоном в 1980 году. Компилятор и виртуальная машина обладают высокой переносимостью и, как следствие, были реализованы на множестве машин.

Основной язык

Базовый язык предоставляет только следующие функции, но расширения обсуждаются в книге Хендерсона для явной поддержки ленивых вычислений и недетерминированного программирования. `atom` для выражения возвращает `True`, если его значение атомарно; `False` в противном случае. `add` для двух выражений возвращает сумму их числовых значений. `car` для выражения, значение которого является парой, возвращает первый элемент пары. `cdr` для выражения, значение которого является парой, возвращает второй элемент пары. `cons` для двух выражений возвращает пару, состоящую из их значений. `div` для двух выражений возвращает частное от деления их числовых значений. `eq` для двух выражений возвращает `True`, если их значения равны; `False` в противном случае. `if` для трех выражений возвращает значение второго выражения, если значение первого выражения истинно, иначе возвращает значение третьего выражения. `lambda` для списка аргументов и выражения возвращает их в виде функции. `let` для выражения с объявлениями (как именованные выражения, видимые в выражении) возвращает его значение. `letrec` аналогичен `let`, за исключением того, что объявленные имена также видны в самих объявлениях. `leq` для двух выражений возвращает `True`, если значение первого выражения меньше или равно значению второго выражения; `False` в противном случае. `mod` (или `rem`) для двух выражений возвращает остаток от деления их числовых значений. `mul` для двух выражений возвращает произведение их числовых значений. `quote` для выражения возвращает это выражение как значение. `sub` для двух выражений возвращает разность их числовых значений. Функции `lambda`, `let` и `letrec` похожи, но имеют тонкие различия в обработке именованных переменных, что делает их полезными в разных ситуациях. `lambda` определяет и возвращает функцию, `let` связывает выражения с именами переменных, а `letrec` по сути аналогичен `let`, за исключением того, что он позволяет определять рекурсивные функции и значения, например, бесконечные ряды.