<?xml version="1.0" encoding="ISO-8859-15"?>
<rss version="2.0"><channel>
<title>konkatenatiiviset ohjelmointikielet</title>
<link>http://sange.fi/~atehwa/cgi-bin/piki.cgi/</link>
<description>Recent changes in konkatenatiiviset ohjelmointikielet</description>
<item><title>konkatenatiiviset ohjelmointikielet</title>
<link>http://sange.fi/~atehwa/cgi-bin/piki.cgi/konkatenatiiviset%20ohjelmointikielet</link>
<guid>http://sange.fi/~atehwa/cgi-bin/piki.cgi/#1406613765</guid>
<description>&lt;p&gt;&lt;ins&gt;(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.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;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.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;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)))) }}}&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Kombinaattorikalkyyli: {{{ square-list = map (S * I) 
contains-even? = B not (B null? (filter (B (= 0) (C mod 2)))) }}}&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Factor: {{{ : square-list [ dup * ] map ; : contains-even? [ 2 
% 0 = ] filter empty? not ; }}}&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;(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.)&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;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'' 
&lt;=&gt; (C ''f''), dup ''f'' &lt;=&gt; (W ''f''), ''f'' ''g'' &lt;=&gt; (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.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Veikkaan, että jossain tilanteessa esim. Haskellin 
automaattinen osittaissovellus tuottaa kuitenkin vielä tiiviimpää 
koodia.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Kas, joku on tehnyt tästä käsitteen: 
http://en.wikipedia.org/wiki/Tacit_programming&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;----&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;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/&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;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&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;* [merkintä: 2013-05] * [atehwa] * [kategoria: 
päiväkirjamerkintä] * [kategoria: ohjelmointi] * [funktio] * [lambda 
ry]&lt;/ins&gt;

</description>
<pubDate>Tue, 29 Jul 2014 06:02:45 +0000</pubDate>
</item>

</channel></rss>
