-исчисление

Описание

-исчисление (лямбда-исчисление) лежит в основе большинства функциональных языков программирования: семейства Лиспа (Common Lisp, Scheme, Clojure и др.) и семейства ML (Standard ML, Haskell, Agda и пр.).

-исчисление состоит из языка -выражений и набора правил преобразования. Базовые правила построения -выражений:

Для удобства работы с -выражениями, при записи могут использоваться следующие упрощения:

внешние скобки могут быть опущены
;
аппликация считается лево-ассоциативной
;
тело -выражения распространяется вправо насколько возможно
;
последовательные -абстракции схлопываются в одну
.

Оператор связывает переменную в выражении . Переменные, подпадающие под какой-либо оператор -абстракции, называются связанными. Все прочие переменные называются свободными. Например, переменная свободна в выражении . Переменная связывается ближайшим оператором . Например, единственное вхождение переменной в выражении связано со вторым оператором .

Значение -выражения определяется правилами редукции:

-конверсия
переименовывание связанных переменных
-редукция
применение функции к аргументам
-конверсия
выражает принцип две функции идентичны, если имеют одинаковый результат на всех входах

Применение функции к аргументам осуществляется засчёт подстановки выражения-аргумента вместо связанной переменной в теле -выражения:

Язык -выражений может быть расширен:

Минимальные требования (базовая часть)

Базовая реализация проекта, в которой должны разбираться все участники, должна:

Расширенный парсер (индивидуальная часть)

Расширенный парсер должен добавлять хотя бы 2 различные возможности к базовому варианту. Ниже перечислены возможные варианты расширения парсера, однако этим списком они не ограничены:

Система типов (индивидуальная часть)

Система типов помогает определить семантику -выражений, но также может быть использована для оптимизаций при интерпретации и генерации кода.

Система типов должна поддерживать хотя бы 2 различные возможности:

Расширенная интерактивная среда (индивидуальная часть)

Расширенная интерактивная среда должна добавлять хотя бы 2 различные возможности к базовому интерфейсу. Ниже перечислены возможные варианты расширения интерактивной среды, однако этим списком они не ограничены:

Генерация кода (индивидуальная часть)

Модуль генерации кода — предпоследний этап компиляции. Генерация кода может быть реализована многими способами, но чтобы простым образом получить портируемый компилятор, можно генерировать промежуточный код на низкоуровневом языке программирования, таком как C или еще ниже, например, LLVM.

Генерация кода должна переводить именованные -термы в соответствующие функции (для этого язык должен быть расширен возможностью именования -термов).

Демонстрация генерации кода должна включать в себя программу на любом языке, использующую сгененированный объектный код при сборке.