Unlambda on David Madoren keksimä minimaalinen toiminnallinen ohjelmointikieli . Se perustuu kombinatoriseen logiikkaan , lambda - laskun muunnelmaan , josta on jätetty pois lambda - operaattori . Kieli perustuu pääasiassa kahteen sisäänrakennettuun funktioon ( s ja k ) ja sovellusoperaattoriin ( ` ). Tämä yksin tekee Turing -kielestä täydellisen , mutta siinä on myös useita I/O-toimintoja käyttäjän vuorovaikutusta varten, toiminto laiskalle arvioinnille ja joidenkin toimintojen lyhyitä vastineita.
Esoteerisena ohjelmointikielenä Unlambda on tarkoitettu esittelyksi erittäin puhtaasta toiminnallisesta kielestä, ei käytännön käyttöön. Pääominaisuus on tavanomaisten operaattoreiden ja tietotyyppien puuttuminen - yhden argumentin funktiot ovat ainoa tietotyyppi. Tästä huolimatta tiedot voidaan toistaa sopivilla funktioilla, kuten lambda-laskennassa. Funktioita, joissa on useita argumentteja, voidaan currioida .
Unlambda perustuu abstraktion eliminoinnin periaatteeseen eli kaikkien tallennettujen muuttujien, mukaan lukien funktioiden, eliminointiin. Kuten puhtaasti toiminnallisessa kielessä, Unlambdassa funktiot eivät ole vain ensimmäisen luokan objekteja , vaan myös ainoita ensimmäisen luokan objekteja.
Esimerkki Hello world -ohjelmasta näyttää tältä:
`r````````````.Hei .worldiEnnätys. x osoittaa funktioon, joka ottaa yhden argumentin ja palauttaa sen muuttumattomana, myös tulostaen "x"-merkin, kun sitä kutsutaan sivuvaikutuksena . i edustaa identiteettikartoituksen varianttia, jolla ei ole sivuvaikutuksia ja jota käytetään valeargumenttina. `.di-ohjelma käyttää .d- funktiota , joka tulostaa merkin "d" argumenttiin i , palauttaen i :n ja tulostaen sivuvaikutuksena "d". Vastaavasti ``.l.di käyttää ensin .l :tä .d :hen , tulostaen "l":n ja palauttaen .d :n , jota sitten sovelletaan i :hen kuten edellisessä esimerkissä. R - funktio on syntaktinen sokeri funktiolle, joka tulostaa rivinvaihdon.
Muita tärkeitä Unlambdan elementtejä ovat funktiot k ja s , kaksi ja kolme argumenttia (jotka ohitetaan currylla). k tuottaa vakiofunktioita: `kx :n tulos on funktio, joka palauttaa x :n, kun sitä kutsutaan . Joten ``kxy :n arvo on x mille tahansa x :lle ja y :lle .
s on yleinen arviointioperaattori . ```sxyz laskee arvoksi ``xz`yz' mille tahansa x :lle , y :lle ja z :lle . Erityisesti s ja k ovat riittäviä minkä tahansa laskelman suorittamiseen (katso lisätietoja SKI-laskennasta ). Lyhyenä esimerkkinä kuvausfunktio i voidaan ilmaista muodossa ``skk' , koska ```skkx palauttaa x :n mille tahansa x :lle .
Unlambdan ainoa ohjausrakenne on jatko , jota merkitään c :llä . Kun lauseke, kuten `cx , arvioidaan, luodaan erityinen "jatko"-objekti, joka edustaa tulkin tämänhetkistä tilaa. Sitten lasketaan x ja laskennan tulos välitetään jatkoon argumenttina. Mutta jos jatkoa käytetään y :lle, x :n suoritus keskeytyy välittömästi ja lausekkeen `cx arvo on y .
Vaikka Unlambdan arviointi on yleensä "innokasta" ( englanninkielisen termin innokas arviointi kirjaimellinen käännös ; eli argumentin arvo arvioidaan ennen kuin se siirretään funktioon), on olemassa mahdollisuus laiskalle arvioinnille , jota merkitään operaattorilla d . Yleensä Unlambda arvioi lausekkeen, kuten `xy , ensin x :n , sitten y :n ja soveltaa sitten x :ää y :ään . Jos x :n arvo on d , y :tä ei arvioida. `dy - lausekkeen arvo on erityinen laiska arviointiobjekti, joka, kun sitä käytetään argumenttiin z , arvioi y : n ja soveltaa sitten tuloksena olevaa arvoa z :hen . Huomaa, että tämä on sama kuin "iy ilman sivuvaikutuksia " . Erona on, että `y suorittaa kaikki sivuvaikutukset y :lle välittömästi, kun taas `dy viivyttää niitä, kunnes tulosta käytetään toiseen argumenttiin.
Funktio v ottaa argumentin, jättää sen huomioimatta ja palauttaa v :n . Sitä voidaan soveltaa mihin tahansa määrään argumentteja. V - kirjainta ei tarvita, koska se voidaan ilmaista muodossa ```sii``s`kk``sii (eli Lisp-merkinnällä tai perinteisellä merkinnällä), mutta se on läsnä mukavuuden vuoksi (ja myös tulkin nopeuttamiseksi) .
Syötteen Unlambdaan tarjoavat @ - ja ?u -operaattorit . Kun @ käytetään funktioon x , merkki luetaan syötteestä ja tallennetaan "nykyisenä merkkinä" ( nykyinen merkki ), sitten x käytetään i :lle . Jos syötteessä ei ole enää merkkejä, "nykyinen merkki" jää määrittelemättömäksi. Kun ?u -funktiota käytetään x :ään , tulos on `xi , jos nykyinen merkki on u , muuten `xv arvioidaan .
On myös toiminto nykyisen merkin tulostamiseen - | . Arvioitaessa `|x -funktiota x - funktiota käytetään .u :lle, jos u on nykyinen merkki, muussa tapauksessa funktioon v , jos nykyinen merkki on määrittelemätön.
Ja lopuksi on poistumisoperaattori - e . Kun e käytetään x :ään, ohjelman suoritus keskeytyy ja x palautetaan ohjelman tuloksena (useimmat olemassa olevat tulkit jättävät sen huomiotta).
Ohjelmointikielet | |
---|---|
|