Unlambda

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

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

Unlambda заснована на принципі винятку абстракцій (abstraction elimination) або виключення всіх збережених змінних, включаючи функції. Як в чисто функціональному мовою, в Unlambda функції не тільки є об'єктами першого роду (first-class object), але і єдиними об'єктами першого роду.


1. Hello World!

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

 `R `` `` `` `` ```. Hello. Worldi 

Запис. 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.


3. Керуюча конструкція

Єдиною керуючої конструкцією Unlambda є продовження, позначуване символом c. Коли вираз виду `cx обчислюється, утворюється спеціальний об'єкт" продовження ", що представляє стан інтерпретатора в даний момент. Тоді обчислюється x і результат обчислення передається продовженню як аргумент. Але якщо продовження застосовується до y, тоді виконання x відразу ж переривається і значенням виразу `cx є y.


4. Ледачі обчислення

Хоча обчислення в Unlambda зазвичай "енергійні" (дослівний переклад англомовного терміна eager evaluation; тобто значення аргументу обчислюється перед передачею в функцію), є можливість ледачих обчислень, що позначається оператором d. Зазвичай для обчислення виразу виду `xy, Unlambda спочатку обчислює x, потім y і після цього застосовує x до y. Якщо ж значенням x буде d, тоді y не обчислюється. Значення виразу `dy - спеціальний об'єкт відкладеного обчислення, який, коли застосовується до аргументу z, обчислює y і тоді застосовує отримане значення до z. Варто зауважити, що за відсутності побічних ефектів це те ж саме, що `iy. Різниця в тому, що `y виконує будь-які побічні ефекти в y негайно, тоді, як` dy відкладає їх, поки результат не буде застосований до іншого аргументу.


5. 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) ), Але присутній для зручності (а також для прискорення роботи інтерпретатора).

6. Ввід / вивід

Введення в Unlambda забезпечується операторами @ і? U. Коли @ застосовується до функції x, символ зчитується зі введення і зберігається як "поточний символ" (current character), потім x застосовується до i. Якщо немає більше символів на вводі, то "поточний символ" залишається невизначеним. Коли функція? U застосовується до x, результатом буде обчислення `xi, якщо поточним символом є u, інакше обчислити` xv.

Також є функція друку поточного символу - |. При обчисленні `| x функція x застосовується до. U, якщо u поточний символ, інакше до v, якщо поточний символ невизначений.


7. Вихід

І на закінчення мається оператор виходу - e. Коли e застосовується до x, виконання програми переривається, і x повертається як результат програми (більшість існуючих інтерпретаторів його ігнорують).