Unlambda je minimální funkcionální programovací jazyk , který vynalezl David Madore . Je založen na kombinatorické logice , variantě lambda počtu , která vynechává operátor lambda . Jazyk se opírá hlavně o dvě vestavěné funkce ( sak ) a operátor aplikace ( ` ). To samo o sobě dělá jazyk Turing kompletním , ale má také několik I/O funkcí pro interakci s uživatelem, funkci pro líné vyhodnocování a krátké ekvivalenty některých funkcí.
Unlambda je esoterický programovací jazyk a má být ukázkou velmi čistého funkcionálního jazyka, nikoli pro praktické použití. Hlavním rysem je absence konvenčních operátorů a datových typů – funkce jednoho argumentu jsou jediným datovým typem. Navzdory tomu lze data reprodukovat pomocí příslušných funkcí, jako v lambda kalkulu. Funkce s více argumenty mohou být curried .
Unlambda je založena na principu eliminace abstrakce neboli eliminace všech uložených proměnných včetně funkcí. Stejně jako v čistě funkčním jazyce nejsou funkce v Unlambda pouze prvotřídními objekty , ale také jedinými prvotřídními objekty.
Příklad programu Hello world vypadá takto:
`r```````````. Ahoj .worldiZáznam. x ukazuje na funkci, která přebírá jeden argument a vrací jej beze změny, přičemž jako vedlejší efekt při volání také vytiskne znak "x" . i představuje variantu mapování identity , která nemá žádné vedlejší účinky a používá se jako fiktivní argument. Program `.di aplikuje funkci .d , která vypíše znak "d", na argument i , vrátí i a vypíše "d" jako vedlejší efekt. Podobně ``.l.di nejprve použije .l na .d , vytiskne "l" a vrátí .d , které se pak použije na i jako v předchozím příkladu. Funkce r je syntaktický cukr pro funkci, která tiskne znak nového řádku.
Mezi další důležité prvky Unlambda patří funkce k a s , respektive dva a tři argumenty (předávané curryingem). k vytváří konstantní funkce: výsledkem `kx je funkce, která při volání vrací x . Takže hodnota ``kxy bude x pro libovolné x a y .
s je zobecněný operátor hodnocení . ```sxyz se vyhodnotí jako ,,xz`yz' pro libovolné x , y a z . Je pozoruhodné, že sak stačí k provedení jakéhokoli výpočtu (podrobnosti viz výpočet SKI ) . Jako krátký příklad lze mapovací funkci i vyjádřit jako ,,skk ' , protože ,,skkx vrací x pro libovolné x .
Jediným kontrolním konstruktem Unlambda je pokračování , označené c . Když je vyhodnocen výraz jako `cx , vytvoří se speciální "pokračovací" objekt představující aktuální stav interpretru. Poté se vypočítá x a výsledek výpočtu se předá pokračování jako argument. Ale pokud je na y aplikováno pokračování , pak je provádění x okamžitě přerušeno a hodnota výrazu `cx je y .
I když je vyhodnocování v Unlambdě obvykle „horlivé“ (doslovný překlad anglického výrazu eager evaluation ; to znamená, že hodnota argumentu je vyhodnocena před předáním funkci), existuje možnost líného vyhodnocení , označovaného operátorem d . K vyhodnocení výrazu jako `xy obvykle Unlambda nejprve vyhodnotí x , poté y a poté aplikuje x na y . Pokud je hodnota x d , pak se y nevyhodnocuje. Hodnota výrazu `dy je speciální líný vyhodnocovací objekt, který při použití na argument z vyhodnotí y a poté použije výslednou hodnotu na z . Všimněte si, že je to stejné jako `iy, pokud nejsou žádné vedlejší účinky . Rozdíl je v tom, že `y provede jakékoli vedlejší účinky na y okamžitě, zatímco `dy je zdrží, dokud se výsledek nepoužije na jiný argument.
Funkce v vezme argument, ignoruje ho a vrátí v . Lze jej použít na libovolný počet argumentů. V není potřeba, protože může být vyjádřeno jako ```sii``s`kk``sii (to znamená v Lisp notaci nebo tradiční notaci), ale je přítomno pro pohodlí (a také pro urychlení tlumočníka) .
Vstup do Unlambda zajišťují operátory @ a ?u . Když je @ aplikováno na funkci x , znak je přečten ze vstupu a uložen jako "aktuální znak" ( aktuální znak ), potom je x aplikováno na i . Pokud ve vstupu nejsou žádné další znaky, pak "aktuální znak" zůstane nedefinovaný. Když je funkce ?u aplikována na x , výsledkem bude `xi , pokud je aktuální znak u , jinak se vyhodnotí `xv .
K dispozici je také funkce pro tisk aktuálního znaku - | . Při vyhodnocování `|x se funkce x použije na .u , pokud u je aktuální znak, jinak na v , pokud aktuální znak není definován.
A nakonec je tu operátor výstupu - např . Když je e aplikováno na x , provádění programu je přerušeno a je vráceno x jako výsledek programu (většina existujících interpretů to ignoruje).
Programovací jazyky | |
---|---|
|