Кіріспе

Функционалдық бағдарламалау тілі

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 тұрақты нүктелік комбинаторды білдіреді.

2-ші нұсқадағы кіріктірілген функциялар

Unlambda нұсқасы 2-де жаңадан бірнеше кіріктірілген функциялар енгізілді. Кіріс @ және ?u операторлары арқылы жеңілдетіледі. @ функциясы x-ке қолданылғанда, кірістен бір таңба оқылып, "ағымдағы таңба" ретінде сақталады; содан кейін x, i-ге қолданылады. Бірақ, егер кірісте таңбалар қалмаса, ағымдағы таңба анықталмайды және x орнына v қолданылады. ?u функциясы x функциясына қолданылғанда, егер ағымдағы таңба u болса, `xi бағаланады, әйтпесе `xv бағаланады. Сондай-ақ, "қайта басып шығару" операторы | бар. |x бағаланғанда, егер u ағымдағы таңба болса, x функциясы u-ға, ал егер ағымдағы таңба болмаса, v-ға қолданылады. Соңында, шығу операторы e бар. e функциясы x-ке қолданылғанда, бағдарламаның орындалуы тоқтатылады және x бағдарламаның нәтижесі ретінде алынады (қазіргі интерпретаторлардың көпшілігі бұл нәтижені ескермейді).