Унлямбда
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2020 г. ) |
Парадигма | Почти чистый функционал |
---|---|
Разработано | Дэвид Мадор |
Разработчик | Дэвид Мадор |
Впервые появился | 28 июня 1999 г |
Стабильная версия | 2.0.0
/ 20 декабря 1999 г |
Дисциплина набора текста | Нетипизированный |
Язык реализации | Схема , C , Java |
Лицензия | GPL 2.0 или новее |
Веб-сайт | www |
Унлямбда — это минимальный, «почти чистый » [1] язык функционального программирования, изобретенный Дэвидом Мадором. Он основан на комбинаторной логике , системе выражений без лямбда-оператора или свободных переменных. Он опирается в основном на две встроенные функции ( s
и k
) и оператор применения (записанный `
, символ обратной кавычки ). Уже одно это делает его полным по Тьюрингу , но есть также некоторые функции ввода/вывода (I/O), позволяющие взаимодействовать с пользователем, некоторые функции быстрого доступа и функция ленивой оценки . Переменные не поддерживаются.
Unlambda — это бесплатное программное обеспечение с открытым исходным кодом, распространяемое по лицензии GNU General Public License (GPL) 2.0 или более поздней версии. [ нужны разъяснения ]
Основные принципы [ править ]
Будучи эзотерическим языком программирования , Unlambda предназначен для демонстрации очень чистого функционального программирования, а не для практического использования. Ее главная особенность — отсутствие традиционных операторов и типов данных — единственным видом данных в программе являются однопараметрические функции. Тем не менее, данные можно моделировать с помощью соответствующих функций, например, в лямбда-исчислении . Многопараметрические функции могут быть представлены с помощью метода каррирования .
Unlambda основана на принципе устранения абстракции , или исключения всех сохраненных переменных, включая функции. Как чисто функциональный язык, функции Unlambda являются объектами первого класса и единственными такими объектами.
Вот реализация программы hello world в Unlambda: [1]
`r```````````.H.e.l.l.o. .w.o.r.l.di
Оригинальные встроенные функции [ править ]
Обозначения .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 .
Единственная конструкция управления потоком Unlambda — это вызов с текущим продолжением , обозначаемый 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
откладывает побочные эффекты до тех пор, пока результат не будет применен к другому аргументу.
Следующий встроенный оператор Unlambda — v
, который игнорирует свой аргумент и возвращает v
. Эта функция не является строго необходимой, поскольку v
может быть реализован как ``s`k``s``s`kskk`k``s``s`kskk
, но он предоставляется для удобства. (Это выражение выше просто `Yk
, где Y
обозначает комбинатор с фиксированной точкой .)
Встроенные функции версии 2 [ править ]
В Unlambda версии 2 было представлено больше встроенных модулей. Ввод облегчается операторами. @
и ?u
. Когда @
применяется к функции x , символ считывается из ввода и сохраняется как «текущий символ»; тогда x применяется к i
. Однако, если на входе больше не было доступных символов, текущий символ остается неопределенным, и x. к нему применяется v
вместо. Когда функция ?u
применяется к функции x , результатом является оценка `xi
если текущий символ — u , в противном случае `xv
оценивается.
Еще есть оператор "перепечатки" |
. Когда `|x
оценивается, функция x применяется к .u
если u — текущий символ или v
если текущего символа нет.
Наконец, есть оператор выхода e
. Когда e
применяется к x , выполнение программы прекращается, и x принимается как результат программы (большинство существующих на данный момент интерпретаторов все равно игнорируют результат).
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б Чу-Кэрролл, Марк К. (11 августа 2006 г.). «Пятничное патологическое программирование: Унлямбда, или Программирование без переменных» . Хорошая математика, плохая математика (блог) . Научные блоги.
- Феликс-Эрнандес Кампос (1 апреля 2002 г.), Лекция 28: Еще о функциональном программировании , Университет Северной Каролины COMP144.
- Ютака Хара (2008). Странный язык программирования, созданный с помощью Ruby (на японском языке: Mainichikomynikēshonzu, стр. 205–214) . 978-4-8399-2784-4 .