Кіріспе
Функционалдық бағдарламалау тілі
Unlambda – Дэвид Мадор ойлап тапқан минималды, «шамалы таза» функционалдық бағдарламалау тілі. Ол комбинаторлық логикаға негізделген, лямбда операторы немесе еркін айнымалыларсыз өрнектер жүйесі. Ол негізінен екі кіріктірілген функцияға (s және k) және қолдану операторына (`, кері тырнақшамен жазылады) сүйенеді. Олардың ғана өзі оны Тьюринг толықтығына жеткізеді, бірақ сонымен қатар пайдаланушымен өзара әрекеттесуге мүмкіндік беретін кіріс/шығыс (I/O) функциялары, ықшам функциялар және жалқау бағалау функциясы да бар. Айнымалылар қолдау көрсетілмейді. Unlambda – GNU General Public License (GPL) 2.0 немесе одан кейінгі нұсқасы бойынша таратылатын тегін және ашық кодты бағдарламалық құрал.
Бастапқы құрастырылған функциялар
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 және y үшін x болып табылады. s - жалпыланған бағалау операторы. `sxyz` кез келген x, y және z үшін `xz`yz деп бағаланады. Бұл ерекше факт, 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 қайтарады. Жоғарыдағы бұл өрнек жай ғана `Yk`, мұнда Y тұрақты нүктелік комбинаторды білдіреді.
s is a generalized evaluation operator. ```sxyz evaluates to ``xz`yz for any x, y, and z. It is a remarkable fact that s and k are sufficient to perform any calculation, as described in SKI combinator calculus. As a brief example, the identity function i can be implemented as ``skk, since ```skkx yields x for all x.
Unlambda's one flow control construct is call with current continuation, denoted c. When an expression of the form `cx is evaluated, a special continuation object is constructed, representing the state of the interpreter at that moment. Then x is evaluated, and then the result is given the continuation object as an argument. If the continuation is never applied to an argument, the value of the `cx expression is the same as the value of x. But if the continuation object is applied to a value y, execution of x is immediately aborted, and the value of the entire `cx expression is y.
Unlambda's execution semantics are normally eager evaluation, but a lazy evaluation option exists, indicated by the use of the d operator. Usually, to evaluate an expression of the form `xy, unlambda first evaluates x, then y, and then applies x to y. However, if x evaluates to the special value d, then y is not evaluated; instead, the value of the expression `dy is a special "delayed computation" object, which, when applied to an argument z, evaluates y, and then applies its value to z. In the absence of side effects, this is exactly the same as `iy. The difference is that `iy executes any side effects in y immediately, whereas `dy defers the side effects until the result is applied to another argument. Unlambda's next built in operator is v, which ignores its argument and returns v. This feature is not strictly necessary, since v could be implemented as ``s`k``s``s`kskk`k``s``s`kskk, but it is supplied as a convenience. (This expression above is simply `Yk, where Y denotes a fixed point combinator.)
2-ші нұсқадағы кіріктірілген функциялар
Unlambda нұсқасы 2-де жаңадан бірнеше кіріктірілген функциялар енгізілді. Кіріс @ және ?u операторлары арқылы жеңілдетіледі. @ функциясы x-ке қолданылғанда, кірістен бір таңба оқылып, "ағымдағы таңба" ретінде сақталады; содан кейін x, i-ге қолданылады. Бірақ, егер кірісте таңбалар қалмаса, ағымдағы таңба анықталмайды және x орнына v қолданылады. ?u функциясы x функциясына қолданылғанда, егер ағымдағы таңба u болса, `xi бағаланады, әйтпесе `xv бағаланады. Сондай-ақ, "қайта басып шығару" операторы | бар. |x бағаланғанда, егер u ағымдағы таңба болса, x функциясы u-ға, ал егер ағымдағы таңба болмаса, v-ға қолданылады. Соңында, шығу операторы e бар. e функциясы x-ке қолданылғанда, бағдарламаның орындалуы тоқтатылады және x бағдарламаның нәтижесі ретінде алынады (қазіргі интерпретаторлардың көпшілігі бұл нәтижені ескермейді).