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