pyLambda - это интерпретатор языка, основанного на нетипизированном λ-исчислении.
Основное назначение языка - учебное. Язык устроен так, что в интерпретатор можно просто копировать примеры из учебников по λ-исчислению, и они будут работать. Что-либо полезное на этом языке написать сложно, т.к. λ-исчисление довольно далеко от привычных языков программирования, в частности, здесь нет условных операторов, операторов цикла и пр., хотя теоретически всё это можно реализовать на самом языке.
Язык состоит из следующих «частей»:
Остальные части являются расширениями λ-исчисления:
Кроме того, интерпретатор понимает несколько специальных команд (они должны быть записаны в отдельной строке):
Вычисление выражения происходит в два этапа. На первом совершаются все возможные β-редукции (с предварительной α-конверсией) и η-редукци, в нормальном, или «ленивом» порядке, то есть слева направо. При этом не делается попытки привести выражение к нормальной форме, во-первых потому, что это могло бы привести к зацикливанию, во-вторых с тем, чтобы можно было проследить все стадии вычисления. На втором этапе вместо имен переменных подставляются их значения и производятся арифметические операции. На втором этапе возможно зацикливание из-за бесконечно рекурсивных определений. Прервать вычисление можно нажатием Ctrl-C.
Специальная переменная % ссылается на результат предыдущего вычисления. Таким образом, не до конца вычисленное выражение можно заставить вычисляться дальше, просто введя %. Однако это обычная переменная, правило ленивости применимо и к ней, поэтому с присваиваниями вроде z=% следует быть очень осторожным.
Переменные не имеют типов (реализовано бестиповое λ-исчисление). Выражения же имеют тип, то есть могут быть нескольких разновидностей. Именно, тип выражения может быть:
Интерпретатор показывает тип вычисленного выражения (через ::) в основном для того, чтобы можно было сориентироваться, что из себя представляет длинное выражение.
На этапе α-конверсии существует неотловленный баг, приводящий к тому, что в некоторых сложных выражениях подтерм λx.λy.x превращается в λx.λy.x'. Если кому-нибудь удастся хотя бы выявить точные условия проявления бага, а еще лучше - исправить его, буду очень благода ;)
Илья Портнов, http://iportnov.blogspot.com
GNU GPL v3 or any later.