(nettipäiväkirja 14.05.2013) [Factor] ja muun konkatenatiiviset kielet ovat hyvin tiiviitä. On tarkastelemisen arvoista, miten nämä kielet onnistuvat olemaan ilmaisultaan niin lyhyitä kuin ovat. Yksi tärkeä syy on se, että funktioiden parametreja ei deklaroida eikä merkitä. Mutta kombinatorinen logiikka eliminoi myös lokaalit muuttujat, ja silti lausekkeet ovat siinä monimutkaisempia kuin konkatenatiivisissa kielissä. Lisäksi tulokset ovat ainakin minusta vaikeampia lukea.
Tarkastellaan esimerkiksi funktiota, joka ottaa syötteekseen listan lukuja ja palauttaa uuden listan, jossa on syötelistan lukujen neliöt. Toinen esimerkki voisi olla funktio, joka kertoo, onko listassa yhtään parillista lukua.
Scheme: {{{ (define (square-list ls) (map (lambda (x) (* x x)) ls)) (define (contains-even? ls) (not (null? (filter (lambda (x) (= 0 (mod x 2))) ls)))) }}}
Kombinaattorikalkyyli: {{{ square-list = map (S * I) contains-even? = B not (B null? (filter (B (= 0) (C mod 2)))) }}}
Factor: {{{ : square-list [ dup * ] map ; : contains-even? [ 2 % 0 = ] filter empty? not ; }}}
(Kyllä, tiedän että sekä Factorissa että useimmissa Schemeissä on any?-predikaatti, mutta haluan vähän monimutkaisemman määritelmän, jotta eron näkee paremmin.)
Jotenkin pinon käsittely vain on useimmissa tapauksissa pienempi vaiva kuin parametrien ohjaaminen kombinaattoreilla. Hinta on, että pinoa pitää joskus uudelleenjärjestellä hallintasanoilla (swap, over, drop, ...) tai kombinaattoreilla (keep, cleave, ...). Monia hallintasanoja vastaa käytännössä jokin kombinaattori: esim. swap ''f'' <=> (C ''f''), dup ''f'' <=> (W ''f''), ''f'' ''g'' <=> (B ''g'' ''f''). Ehkä eron syy on yhdessä tuo "automaattinen kompositio" + se, että funktiot voivat palauttaa monia arvoja mutta niitä voi ohjailla eri funktioille niin kuin haluaa - tätä ei funktionaalisessa kielessä pysty tekemään ilman muuttujia.
Veikkaan, että jossain tilanteessa esim. Haskellin automaattinen osittaissovellus tuottaa kuitenkin vielä tiiviimpää koodia.
Kas, joku on tehnyt tästä käsitteen: http://en.wikipedia.org/wiki/Tacit_programming
----
Kuten aiemminkin sanoin, näiden konkatenatiivisten kielten tutkimus on melkein kuin sukeltaisi suoraan esoteeristen kielten valtakuntaan. Katsokaapa huviksenne vaikkapa ihan käyttökelpoiseksi tarkoitetun kielen dokumentaatiota: http://om-language.org/
Mutta tässä on kyllä oikeasti jotain suurempaa. Ehkä hyödyllinen linkattava on ''Why concatenative programming matters'': http://evincarofautumn.blogspot.ca/2012/02/why-concatenative-programming -matters.html
* [merkintä: 2013-05] * [atehwa] * [kategoria: päiväkirjamerkintä] * [kategoria: ohjelmointi] * [funktio] * [lambda ry]