<?xml version="1.0" encoding="ISO-8859-15"?>
<rss version="2.0"><channel>
<title>clojuren lukeminen ja makrot</title>
<link>http://sange.fi/~atehwa/cgi-bin/piki.cgi/</link>
<description>Recent changes in clojuren lukeminen ja makrot</description>
<item><title>clojuren lukeminen ja makrot</title>
<link>http://sange.fi/~atehwa/cgi-bin/piki.cgi/clojuren%20lukeminen%20ja%20makrot</link>
<guid>http://sange.fi/~atehwa/cgi-bin/piki.cgi/#1450694575</guid>
<description>&lt;p&gt;&lt;ins&gt;(nettipäiväkirja 21.12.2015) Voisin mainita, että Clojure on 
ollut mielenkiintoinen tutustuttava, mutta kielen kokeellisuus näkyy 
sekä hyvässä että pahassa. Kun jossain [Python]issa syntaksi 
vakiinnutetaan PEP:llä, jos sille koetaan riittävästi tarvetta, 
Clojuressa joku ryntää heti ensimmäiseksi kehittelemään oman DSL:n 
Clojuren sisään ja mahdollisesti toteuttaa makron tai pari, jotka 
tekevät DSL:n käytöstä "siistin näköistä".&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Seuraus on se, että Clojure-koodia lukiessaan ei koskaan voi 
oikein luottaa siihen, että funktiokutsulta näyttävät asiat ovat 
funktiokutsuja, ja joskus virheilmoitukset ovat tosi outoja, koska ne 
seuraavat makroekspansiokoodin oletuksista, jotka eivät toteudu (esim. 
jossain kohdassa on lista kun pitäisi olla vektori). Erilaisia 
makropohjaisia binding formeja on tosi paljon, ja koska Clojuressa on 
aika monipuoliset sisäänrakennetut syntaktiset muodot, makrot voivat 
vapaasti sekoittaa listoja, vektoreita, mappeja, setteja, symboleita ja 
keywordeja ja antaa niille kaikenlaisia merkityksiä.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Pari esimerkkiä: Clojuren require-kieli on suunnilleen 
samanlainen kuin Pythonin import-statementin eri muodot, mutta 
toteutettu lennokkaasti DSL:nä, jossa erilaisilla keywordeilla on 
syntaktisia sisältöjä. Esimerkiksi, kun Pythonissa sanottaisiin:&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;{{{ from mylib.harvest import urlfind, babel }}}&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;... niin Clojuressa sanottaisiin:&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;{{{ (require '[mylib.harvest :refer [urlfind babel]]) }}}&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Toinen esimerkki: Pythonissa (ja Haskellissa, Goferissa jne.) 
on [listakeräelmä]t, joilla voi tehdä kaikenlaista monadista. 
Clojuressa ei ole näitä samassa muodossa, mutta sen sijaan erilaisia 
iteraattoreita (map, filter, reduce, jne) voi yhdistellä ''threading 
macro''illa, joista lisää täällä: 
http://jdevuyst.blogspot.fi/2013/11/thoughts-on-clojure-threading-macros
.html . Sitten kun tällaista koodia lukee, on paras tietää, että nämä 
makrot eivät ole oikeasti funktioita.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Kolmas esimerkki: yksi Clojuren monipuolisimpia 
koodinlyhentäjiä on destrukturointi, jolla saa vedetyksi ja bindatuksi 
muuttujiin monimutkaisesta tietorakenteesta juuri ne osat, jotka 
haluaa. Tämä destrukturointikieli on aikamoinen DSL, joka rakentuu 
ennen kaikkea mappien ja keywordien varaan. Siihen voi tutustua esim. 
täällä: https://gist.github.com/john2x/e1dca953548bfdfb9844&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;Itseäni ehkä tässä kiusaa eniten se, että minusta tämä 
kompromissitie syntaktisen sokerin ja sen puuttumisen välillä ei ole 
ihan fiksu. Minusta makrojen käyttöä lähinnä vaikeuttaa se, että niissä 
voidaan sekoittaa niin monenlaisia elementtejä. Perinteisessä Lispissä 
oli sekä käytännössä helpointa että sanaton sopimus toteuttaa sellaisia 
makroja, jossa kunkin listaformin eli suljelausekkeen ensimmäinen 
symboli kertoo, miten se tulkitaan - sekä top-level formissa että 
kaikissa sen sisällä olevissa. Tämä teki helpoksi suunnitella DSL:aa: 
jos makrossa tarvitaan useammanlaisia määrityksiä, varataan listan 
ensimmäinen symboli tyyppikäyttöön, jos ei, niin käytetään listoja 
vain. Se, että voi valita listoista, vektoreista ja muista sekä käyttää 
vielä keskellä tietorakenteita olevia keywordeja antamaan lisätietoa 
monimutkaistaa DSL:ia ja vaikeuttaa niiden muistamista antamatta 
mielestäni kummoistakaan lisäarvoa.&lt;/ins&gt; 

&lt;p&gt;&lt;ins&gt;* [merkintä: 2015-12] * [atehwa] * [kategoria: 
päiväkirjamerkintä] * [funktio] * [syntaksi] * [symboli] * 
[listakeräelmien käyttö]&lt;/ins&gt;

</description>
<pubDate>Mon, 21 Dec 2015 10:42:55 +0000</pubDate>
</item>

</channel></rss>
