Unlambda

Unlambda

Unlambda — минимальный функциональный язык программирования, придуманный Дэвидом Мэдором (David Madore). Он основан на комбинаторной логике, варианте Лямбда-исчисления, который опускает оператор lambda. Язык полагается в основном на две встроенные функции (s и k) и оператор аппликации (`). Уже это делает язык полным по Тьюрингу, но в нём также есть несколько функций ввода/вывода для возможности взаимодействия с пользователем, функция для ленивых вычислений и короткие эквиваленты некоторых функций.

Будучи эзотерическим языком программирования, Unlambda предназначена для демонстрации очень чистого функционального языка, а не для практического использования. Главная особенность — отсутствие обычных операторов и типов данных — функции от одного аргумента являются единственным типом данных. Несмотря на это, данные могут быть воспроизведены при помощи соответствующих функций, как в лямбда-исчислении. Функции нескольких аргументов могут быть представлены при помощи карринга.

Unlambda основана на принципе исключения абстракций (abstraction elimination) или исключения всех сохранённых переменных, включая функции. Как в чисто функциональном языке, в Unlambda функции не только являются объектами первого рода (first-class object), но и единственными объектами первого рода.

Содержание

Hello World!

Пример программы Hello world выглядит так:

`r```````````.H.e.l.l.o. .w.o.r.l.di

Запись .x указывает на функцию, которая принимает один аргумент и возвращает его неизменным, также в качестве побочного эффекта печатая символ «x» при вызове. i представляет вариант тождественного отображения, у которой нет побочных эффектов и которая используется как фиктивный аргумент. Программа `.di применяет функцию .d, печатающую символ «d», к аргументу i, возвращая i и печатая «d» как побочный эффект. Аналогично ``.l.di сначала применяет .l к .d, печатая «l» и возвращая .d, которая потом применяется к i как в предыдущем примере. Функция r — синтаксический сахар к функции, печатающей символ новой строки.

s и k

Другие важные элементы Unlambda включают в себя функции k и s, двух и трёх аргументов соответственно (передаваемых при помощи карринга). k производит функции-константы: результат `kx — функция, при вызове возвращающая x. Так значением ``kxy будет x для любых x и y.

s — обобщённый оператор вычисления (evaluation operator). ```sxyz вычисляется в ``xz`yz при любых x, y и z. Примечательно, что s и k достаточно для произведения любых вычислений (подробнее см. SKI-исчисление). В качестве краткого примера можно привести, что функция отображения i может быть выражена как ``skk, так как ```skkx возвращает x при любом x.

Управляющая конструкция

Единственной управляющей конструкцией Unlambda является продолжение, обозначаемое символом c. Когда выражение вида `cx вычисляется, образуется специальный объект «продолжение», представляющий состояние интерпретатора в данный момент. Тогда вычисляется x и результат вычисления передается продолжению как аргумент. Но если продолжение применяется к y, тогда выполнение x сразу же прерывается и значением выражения `cx является y.

Ленивые вычисления

Хотя вычисления в Unlambda обычно «энергичные» (дословный перевод англоязычного термина eager evaluation; то есть значение аргумента вычисляется перед передачей в функцию), есть возможность ленивых вычислений, обозначаемая оператором d. Обычно для вычисления выражения вида `xy, Unlambda сначала вычисляет x, затем y и после этого применяет x к y. Если же значением x будет d, тогда y не вычисляется. Значение выражения `dy — специальный объект отложенного вычисления, который, когда применяется к аргументу z, вычисляет y и тогда применяет полученное значение к z. Стоит заметить, что при отсутствии побочных эффектов это то же самое, что `iy. Разница в том, что `y выполняет любые побочные эффекты в y незамедлительно, тогда, как `dy откладывает их, пока результат не будет применён к другому аргументу.

v

Функция v принимает аргумент, игнорирует его и возвращает v. Она может быть применена к любому количеству аргументов. В v нет необходимости, поскольку она может быть выражена как ```sii``s`kk``sii (то есть s \left(i,i,s\left(k\left(k\right),s\left(i,i\right)\right)\right)), но присутствует для удобства (а также для ускорения работы интерпретатора).

Ввод / вывод

Ввод в Unlambda обеспечивается операторами @ и ?u. Когда @ применяется к функции x, символ считывается со ввода и сохраняется как «текущий символ» (current character), затем x применяется к i. Если нет больше символов на вводе, то «текущий символ» остаётся неопределённым. Когда функция ?u применяется к x, результатом будет вычисление `xi, если текущим символом является u, иначе вычислится `xv.

Также есть функция печати текущего символа — |. При вычислении `|x функция x применяется к .u, если u текущий символ, иначе к v, если текущий символ неопределён.

Выход

И в заключение имеется оператор выхода — e. Когда e применяется к x, исполнение программы прерывается, и x возвращается как результат программы (большинство существующих интерпретаторов его игнорируют).

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Unlambda" в других словарях:

  • Unlambda — is a minimal functional programming language invented by David Madore. It is based on combinatory logic, a version of the lambda calculus that omits the lambda operator. It relies mainly on two built in functions ( s and k ) and an apply operator …   Wikipedia

  • Unlambda — est un langage minimal de programmation fonctionnelle inventé par David Madore. Il est fondé sur le principe de la logique combinatoire, une version du lambda calcul qui omet l opérateur lambda. Il repose principalement sur deux fonctions… …   Wikipédia en Français

  • Unlambda — es un lenguaje de programación inventado por David Madore. Este lenguaje es producto de la intersección entre dos lenguajes de programación marginales . Lenguajes de programación ofuscados o lenguaje de programación esotérico, de los cuales el… …   Wikipedia Español

  • Unlambda — es un lenguaje de programación inventado por David Madore. Este lenguaje es producto de la intersección entre dos lenguajes de programación marginales . ● Lenguajes de programación ofuscados, de los cuales el representante canónico es Intercal.… …   Enciclopedia Universal

  • Liste von Hallo-Welt-Programmen/Sonstige — Dies ist eine Liste von Hallo Welt Programmen für grafische Benutzeroberflächen, Web Technologien, exotische Programmiersprachen und Textauszeichnungssprachen. Weitere Beispiele für gebräuchliche Programmiersprachen sind unter Liste von Hallo… …   Deutsch Wikipedia

  • Lisp machine — Lisp machines were general purpose computers designed (usually through hardware support) to efficiently run Lisp as their main software language. In a sense, they were the first commercial single user workstations. Despite being modest in number… …   Wikipedia

  • Open Genera — Firmenlogo Symbolics Inc. war ein US amerikanisches Computer Unternehmen. Es war vor allem für die Entwicklung und den Vertrieb von Lisp Maschinen – speziellen Computern zum Ausführen der Programmiersprache LISP – in den 1980er und 1990er Jahren… …   Deutsch Wikipedia

  • Symbolics Inc. — Firmenlogo Symbolics Inc. war ein US amerikanisches Computer Unternehmen. Es war vor allem für die Entwicklung und den Vertrieb von Lisp Maschinen – speziellen Computern zum Ausführen der Programmiersprache LISP – in den 1980er und 1990er Jahren… …   Deutsch Wikipedia

  • Quine (Informatique) — Pour les articles homonymes, voir Quine. Un quine en informatique est un programme (une sorte de métaprogramme) dont la sortie et le code source sont identiques. À titre de défi ou d amusement, certains programmeurs essaient d écrire le plus… …   Wikipédia en Français

  • Quine (informatique) — Pour les articles homonymes, voir Quine. Un quine en informatique est un programme (une sorte de métaprogramme) dont la sortie et le code source sont identiques. À titre de défi ou d amusement, certains programmeurs essaient d écrire le plus… …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»