Syntax¶
Язык использует S-expression синтаксис. Все составные формы записываются в
скобках. Файл .x должен содержать одно top-level выражение.
Literals¶
Numbers¶
Booleans¶
Строковых literals в текущей версии языка нет.
Variables¶
If¶
Пример:
Logical Forms¶
not вычисляет один boolean-аргумент и возвращает противоположное значение.
and и or принимают два аргумента и вычисляются с short-circuit семантикой:
второй аргумент вычисляется только если он нужен для результата.
Примеры:
Cond¶
Многоветочное условие. Каждая ветка записывается как (condition result).
Последняя ветка должна быть (true result), она используется как fallback.
Парсер разворачивает cond в цепочку вложенных if.
Пример:
Let¶
Связывает имя со значением в теле выражения.
Классический синтаксис:
Sugar-синтаксис:
Оба варианта эквивалентны. Пример:
Let*¶
Последовательные привязки. Каждая следующая binding expression вычисляется в
окружении, где уже доступны предыдущие привязки. Парсер разворачивает let* в
цепочку вложенных let.
Пример:
let* с пустым списком bindings возвращает body:
Letrec¶
Рекурсивное связывание — имя видно внутри самого value. Используется для определения рекурсивных функций.
Пример:
Lambda¶
Анонимная функция.
Классический синтаксис:
Sugar-синтаксис — один параметр:
Sugar-синтаксис — несколько параметров:
Примеры:
Function Application¶
Вызов функции — первый элемент списка, остальные — аргументы.
Примеры:
Lists¶
Пример:
Пустой список создаётся как (list). Синтаксис () не является выражением и
возвращает parse error.
Maybe¶
Maybe создаётся builtins just и nothing и обрабатывается через fmap /
bind.
Пример:
Delay / Force¶
Ленивые вычисления. delay откладывает вычисление выражения, force запускает его.
Пример:
Parse Errors¶
Парсер возвращает понятные ошибки при некорректном синтаксе:
| Ситуация | Ошибка |
|---|---|
| Пустой ввод | Empty input |
| Незакрытая скобка | Missing ')' |
| Лишняя закрывающая скобка | Unexpected ')' |
| Лишние токены после выражения | Unexpected tokens after expression |
Неверное число аргументов у if |
Invalid if syntax |
Неверное число аргументов у and |
Invalid and syntax |
Неверное число аргументов у or |
Invalid or syntax |
Неверное число аргументов у let |
Invalid let syntax |
Неверный синтаксис let* |
Invalid let* syntax / Invalid let* binding syntax |
Неверное число аргументов у letrec |
Invalid letrec syntax |
Неверный синтаксис cond |
Invalid cond syntax / Invalid cond clause syntax |
Неверное число аргументов у lambda |
Invalid lambda syntax |
| Неверный параметр lambda (число или bool) | Invalid parameter name |
Неверный синтаксис => |
Invalid lambda sugar syntax |
Неверное число аргументов у delay |
Invalid delay syntax |
Неверное число аргументов у force |
Invalid force syntax |
Пустой список () |
Empty list |
Ограничения синтаксиса¶
- Комментарии не поддерживаются.
- Строки не поддерживаются.
- Несколько top-level выражений в одном файле не поддерживаются.