Парадигма | Почти чистый функциональный |
---|---|
Разработан | Дэвидом Мадором |
Разработчиком | Дэвидом Мадором |
Впервые появился | 28 июня 1999 г.; 21 год назад (1999-06-28) |
Стабильный выпуск | 2.0.0 / 20 декабря 1999 г.; 20 лет назад (1999-12-20) |
Типографская дисциплина | Нетипизированный |
Язык реализации | Схема, C, Java |
Лицензия | GPL 2.0 или более поздняя |
Веб-сайт | www.madore.org / ~ david / programs / unlambda |
Unlambda - это минимальное, почти чистое «функциональный язык программирования, изобретенный Дэвидом Мадором. Он основан на комбинаторной логике, системе выражений без лямбда-оператора или свободных переменных. Он в основном полагается на две встроенные функции (s
и k
) и оператор применения (записанный `
, символ обратной кавычки ). Только они делают его полным по Тьюрингу, но есть также некоторые функции ввода / вывода (I / O), позволяющие взаимодействовать с пользователем, некоторые функции быстрого доступа и функция ленивого вычисления. Переменные не поддерживаются.
Unlambda - это бесплатное программное обеспечение с открытым исходным кодом, распространяемое по Стандартной общественной лицензии GNU (GPL) 2.0 или более поздней версии.
Как эзотерический язык программирования, Unlambda предназначена для демонстрации очень чистого функционального программирования, а не для практического использования. Его главная особенность - отсутствие обычных операторов и типов данных - единственный вид данных в программе - это однопараметрические функции. Тем не менее, данные можно моделировать с помощью соответствующих функций, как в лямбда-исчислении. Многопараметрические функции могут быть представлены с помощью метода каррирования.
. Без лямбда-выражения основан на принципе исключения абстракции, или исключения всех сохраненных переменных, включая функции. Как чисто функциональный язык, функции Unlambda являются первоклассными объектами и являются единственными такими объектами.
Вот реализация программы hello world на Unlambda:
`r``````````.H.e.l.l.o..worldi
Обозначение .x
обозначает функцию, которая принимает один аргумент и возвращает его без изменений, печатая единственный символ x как сторону эффект при его вызове. i
представляет версию функции идентификации, не имеющую такого побочного эффекта; здесь он используется как фиктивный аргумент. Программа `.di
применяет функцию печати d
к фиктивному аргументу i
, возвращает i
и печатает букву d
как побочный эффект. Аналогично, `.l.di
сначала применяет .l
к .d
, печатает букву l
и возвращает . d
; этот результат .d
затем применяется к i
, как в предыдущем примере. Функция r
- это синтаксический сахар для функции, которая печатает символ новой строки.
Другие важные функции, предоставляемые Unlambda, включают функции k
и s
. k
производит константные функции: результатом `kx
является функция, которая при вызове возвращает x. Таким образом, значение `` kxy
равно x для любых x и y.
s
- оператор обобщенной оценки. `` sxyz
оценивается как `xz`yz
для любых x, y и z. Примечательно, что s
и k
достаточно для выполнения любых вычислений, как описано в SKI комбинаторном исчислении. В качестве краткого примера, функция идентичности i
может быть реализована как `` skk
, поскольку `` skkx
возвращает x для всех x.
Единственная конструкция управления потоком без лямбды - это вызов с текущим продолжением, обозначенный c
. Когда вычисляется выражение вида `cx
, создается специальный объект продолжения, представляющий состояние интерпретатора в этот момент. Затем вычисляется x, а затем результат передается объекту продолжения в качестве аргумента. Если продолжение никогда не применяется к аргументу, значение выражения `cx
будет таким же, как значение x. Но если объект продолжения применяется к значению y, выполнение x немедленно прерывается, и значение всего выражения `cx
равно y.
Семантика выполнения unlambda обычно - это нетерпеливое вычисление, но существует опция отложенного вычисления, на которую указывает использование оператора d
. Обычно для оценки выражения вида `xy
unlambda сначала вычисляет x, затем y, а затем применяет x к y. Однако, если x вычисляется как специальное значение d
, тогда y не вычисляется; вместо этого значение выражения `dy
является специальным объектом« отложенного вычисления », который при применении к аргументу z вычисляет y, а затем применяет свое значение к z. При отсутствии побочных эффектов это то же самое, что и ʻiy
. Разница в том, что ʻiy
немедленно выполняет любые побочные эффекты в y, тогда как `dy
откладывает побочные эффекты до тех пор, пока результат не будет применен к другому аргументу.
Следующий встроенный оператор без лямбды - это v
, который игнорирует свой аргумент и возвращает v
. Эта функция не является строго необходимой, поскольку v
может быть реализован как `s`k``s`kskk`k``s`kskk
, но он поставляется для удобства. (Это выражение выше просто `Yk
, где Y
обозначает комбинатор с фиксированной точкой.)
В Unlambda версии 2 появилось больше встроенных функций. Ввод облегчается операторами @
и ? U
. Когда @
применяется к функции x, символ считывается из ввода и сохраняется как «текущий символ»; затем x применяется к i
. Однако, если на входе больше не было доступных символов, текущий символ остается неопределенным, и вместо этого x применяется к v
. Когда функция ? U
применяется к функции x, результатом является оценка `xi
, если текущий символ u, в противном случае вычисляется ` xv
.
Также есть оператор «перепечатки» |
. Когда вычисляется `| x
, функция x применяется к .u
, если u является текущим символом, или к v
, если текущего символа нет.
Наконец, есть оператор выхода e
. Когда к x применяется e
, выполнение программы прекращается, и x принимается как результат программы (большинство существующих в настоящее время интерпретаторов все равно игнорируют результат).