Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Lispkit Lisp — это лексически-скопируемый, чисто функциональный поднабор языка Lisp («Чистый Lisp»), разработанный как платформа для тестирования концепций функционального программирования. Он впервые использовался для ранних экспериментов с отложенным вычислением. Реализация на базе машины SECD, написанная на варианте ALGOL, была опубликована разработчиком Питером Хендерсоном в 1980 году. Компилятор и виртуальная машина обладают высокой переносимостью и, как следствие, были реализованы на множестве машин.
Lispkit Lisp is a lexically scoped, purely functional subset of Lisp ("Pure Lisp") developed as a testbed for functional programming concepts. It was first used for early experimentation with lazy evaluation. An SECD machine based implementation written in an ALGOL variant was published by the developer Peter Henderson in 1980. The compiler and virtual machine are highly portable and as a result have been implemented on many machines.
Основной язык
Базовый язык предоставляет только следующие функции, но расширения обсуждаются в книге Хендерсона для явной поддержки ленивых вычислений и недетерминированного программирования. `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`, за исключением того, что он позволяет определять рекурсивные функции и значения, например, бесконечные ряды.
The base language provides the following functions only but extensions are discussed in Henderson's book for the explicit support of lazy evaluation and non deterministic programming. atom given an expression returns True if its value is atomic; False if not. add given two expressions returns the sum of their numeric values. car given an expression whose value is a pair, returns the pair's first value. cdr given an expression whose value is a pair, returns the pair's second value. cons given two expressions returns a value pair consisting of their values. div given two expressions returns the quotient of their numeric values. eq given two expressions returns True if their values are equal; False if not. if given three expressions returns the value of the second if the value of the first is True, otherwise returns the value of the third. lambda given an argument list and an expression, returns them as a function. let given an expression with declarations (as named expressions visible in the expression) returns its value. letrec like let, except the declared names are also visible in the declarations themselves. leq given two expressions, returns True if the value of the first is numerically less than or equal to the value of the second; False if not. mod (or rem) given two expressions, returns the modulus (also known as the remainder) of their numeric values. mul given two expressions, returns the product of their numeric values. quote given an expression, returns that expression as a value. sub given two expressions, returns the difference of their numeric values. The functions, lambda, let, and letrec, are similar but have subtle differences in the way that they treat named variables which make them useful in different ways. lambda defines and returns a function, let binds expressions to variable names, and letrec is essentially similar to let except it allows for the definition of recursive functions and values, e. g., infinite series.