Standard Library¶
Стандартная библиотека LispNT добавляется в начальное окружение через
Builtins.makeBuiltins eval.
Все builtins принимают уже вычисленные runtime values и возвращают
Result<Value, EvalError>.
Арифметика и сравнения¶
| Функция | Аргументы | Результат | Пример |
|---|---|---|---|
+ |
2 numbers | number | (+ 1 2) -> 3 |
- |
2 numbers | number | (- 5 3) -> 2 |
* |
2 numbers | number | (* 3 4) -> 12 |
/ |
2 numbers | number | (/ 10 2) -> 5 |
= |
2 numbers или 2 bools | bool | (= 1 1) -> true |
< |
2 numbers | bool | (< 1 2) -> true |
> |
2 numbers | bool | (> 2 1) -> true |
/ выполняет целочисленное деление. Деление на ноль возвращает
DivisionByZero.
= поддерживает только пары numbers и пары booleans. Сравнение значений разных
типов возвращает TypeMismatch.
Логические формы¶
| Форма | Тип | Описание |
|---|---|---|
not |
builtin | принимает один Bool и возвращает отрицание |
and |
parser sugar | binary short-circuit conjunction |
or |
parser sugar | binary short-circuit disjunction |
Примеры:
and и or не являются builtins: parser разворачивает их в if, чтобы второй
аргумент вычислялся только при необходимости.
Списки¶
| Функция | Аргументы | Результат | Описание |
|---|---|---|---|
list |
any number | List |
создать список из аргументов |
head |
1 list | value | первый элемент |
tail |
1 list | List |
список без первого элемента |
cons |
value, list | List |
добавить элемент в начало |
empty? |
1 list | bool | проверить пустоту |
Примеры:
Ожидаемые результаты:
Ошибки:
- не-list аргумент возвращает
TypeMismatch("List", actual); headпустого списка возвращаетOtherEvalError "head: empty list";tailпустого списка возвращаетOtherEvalError "tail: empty list";- неправильное число аргументов возвращает
WrongArgumentCount.
Функции высшего порядка¶
| Функция | Аргументы | Результат | Описание |
|---|---|---|---|
map |
function, list | List |
применить function к каждому элементу |
filter |
function, list | List |
оставить элементы, для которых predicate возвращает true |
fold |
function, initial value, list | value | левая свёртка списка |
Примеры:
(map (lambda (x) (* x 2)) (list 1 2 3))
(filter (lambda (x) (> x 2)) (list 1 2 3 4))
(fold + 0 (list 1 2 3))
Ожидаемые результаты:
map, filter и fold могут применять как пользовательские closures, так и
builtins. Если function возвращает ошибку, вся операция возвращает эту ошибку.
filter требует, чтобы predicate возвращал Bool.
Maybe¶
Maybe представляет значение, которое может отсутствовать:
| Функция | Аргументы | Результат | Описание |
|---|---|---|---|
just |
1 value | Maybe |
обернуть значение |
nothing |
0 | Maybe |
пустое значение |
fmap |
function, maybe | Maybe |
применить function внутри Just |
bind |
maybe, function | Maybe |
монадическая цепочка |
Примеры:
(just 5)
(nothing)
(fmap (lambda (x) (* x 2)) (just 5))
(fmap (lambda (x) (* x 2)) (nothing))
(bind (just 4) (lambda (x) (just (* x 2))))
Ожидаемые результаты:
Семантика:
fmapприменяет function только дляJust value;fmapнадNothingвозвращаетNothing;bindнадJust valueтребует, чтобы function вернулаMaybe;bindнадNothingвозвращаетNothing.
Ленивость¶
Язык строгий по умолчанию. Ленивость реализуется специальными формами
delay и force.
| Форма | Описание |
|---|---|
delay |
создать thunk без вычисления expression |
force |
вычислить thunk и вернуть результат |
Пример:
Ожидаемый результат:
Повторный force того же thunk возвращает cached result без повторного eval.
Thunk захватывает lexical environment в момент delay.
Что не входит в стандартную библиотеку¶
В текущей версии нет:
print;- string operations;
- file IO;
- mutation;
- n-ary
and/or.