Unlambda är ett minimalt funktionellt programmeringsspråk som uppfunnits av David Madore . Den är baserad på kombinatorisk logik , en variant av lambdakalkylen , som utelämnar lambdaoperatorn . Språket bygger huvudsakligen på två inbyggda funktioner ( s och k ) och applikationsoperatören ( ` ). Bara detta gör språket Turing komplett , men det har också flera I/O-funktioner för användarinteraktion, en funktion för lat utvärdering och korta motsvarigheter till vissa funktioner.
Eftersom Unlambda är ett esoteriskt programmeringsspråk är det tänkt att vara en demonstration av ett mycket rent funktionellt språk, inte för praktiskt bruk. Huvudfunktionen är frånvaron av konventionella operatorer och datatyper - funktioner för ett argument är den enda datatypen. Trots detta kan data reproduceras med hjälp av lämpliga funktioner, som i lambdakalkylen. Funktioner med flera argument kan vara curry .
Unlambda är baserad på principen om abstraktionseliminering , eller eliminering av alla lagrade variabler, inklusive funktioner. Som i ett rent funktionellt språk är funktioner i Unlambda inte bara förstklassiga objekt utan också de enda förstaklassobjekten.
Ett exempel på Hello world-program ser ut så här:
`r````````````.Hej .worldiSpela in. x pekar på en funktion som tar ett argument och returnerar det oförändrat, och skriver även ut "x"-tecknet när det anropas som en bieffekt . i representerar en variant av identitetskartläggningen som inte har några biverkningar och som används som ett dummy-argument. `.di-programmet tillämpar .d - funktionen , som skriver ut tecknet "d", på argumentet i , returnerar i och skriver ut "d" som en bieffekt. På samma sätt tillämpar ``.l.di först .l på .d , skriver ut "l" och returnerar .d , som sedan tillämpas på i som i föregående exempel. r - funktionen är syntaktisk socker för en funktion som skriver ut ett nyradstecken.
Andra viktiga delar av Unlambda inkluderar funktionerna k och s , två respektive tre argument (som passeras av currying). k producerar konstanta funktioner: resultatet av `kx är en funktion som returnerar x när den anropas . Så värdet på `` kxy kommer att vara x för alla x och y .
s är en generaliserad utvärderingsoperatör . ```sxyz utvärderas till ``xz`yz' för alla x , y och z . Noterbart är att s och k är tillräckliga för att utföra alla beräkningar (se SKI-kalkyl för detaljer ). Som ett kort exempel kan mappningsfunktionen i uttryckas som ``skk ' , eftersom ```skkx returnerar x för valfritt x .
Unlambdas enda kontrollkonstruktion är fortsättning , betecknad med c . När ett uttryck som `cx utvärderas skapas ett speciellt "fortsättnings"-objekt som representerar tolkens tillstånd för tillfället. Sedan beräknas x och resultatet av beräkningen skickas till fortsättningen som ett argument. Men om fortsättning tillämpas på y avbryts exekveringen av x omedelbart och värdet på uttrycket `cx är y .
Även om utvärdering i Unlambda vanligtvis är "nitisk" (bokstavlig översättning av den engelska termen eager evaluation ; det vill säga värdet av ett argument utvärderas innan det skickas till en funktion), finns det en möjlighet för lat utvärdering , betecknad med d -operatorn . Vanligtvis, för att utvärdera ett uttryck som `xy , utvärderar Unlambda först x , sedan y , och tillämpar sedan x på y . Om värdet på x är d , utvärderas inte y . Värdet på `dy- uttrycket är ett speciellt lat utvärderingsobjekt som, när det appliceras på ett argument z , utvärderar y och sedan tillämpar det resulterande värdet på z . Observera att detta är detsamma som `iy i frånvaro av biverkningar . Skillnaden är att `y exekverar alla biverkningar på y omedelbart, medan `dy fördröjer dem tills resultatet appliceras på ett annat argument.
Funktionen v tar ett argument, ignorerar det och returnerar v . Det kan appliceras på valfritt antal argument. V : et behövs inte, eftersom det kan uttryckas som ```sii``s`kk``sii (det vill säga i Lisp-notation eller traditionell notation), men är närvarande för bekvämlighet (och även för att påskynda tolken) .
Indata till Unlambda tillhandahålls av @ - och ?u- operatörerna . När @ tillämpas på funktionen x läses tecknet från inmatningen och lagras som det "aktuella tecknet" ( aktuellt tecken ), sedan tillämpas x på i . Om det inte finns fler tecken i inmatningen förblir det "nuvarande tecknet" odefinierat. När ?u- funktionen tillämpas på x , blir resultatet `xi om det aktuella tecknet är u , annars kommer `xv att utvärderas .
Det finns också en funktion för att skriva ut det aktuella tecknet - | . När du utvärderar `|x , tillämpas x - funktionen på .u om u är det aktuella tecknet, annars på v om det aktuella tecknet är odefinierat.
Och slutligen finns det en utgångsoperatör - e . När e appliceras på x avbryts programexekveringen och x returneras som ett resultat av programmet (de flesta befintliga tolkar ignorerar det).
Programmeringsspråk | |
---|---|
|