Uusi vuosi, uusi ohjelmointikieli: Clojure
Viikko sitten katselin Rich Hickeyn esityksen Strange Loop 2011 konferenssissa. Tämä Simple Made Easy -luento lienee ilmeisti jonkinainen klassikko, päätellen siitä kuinka monta viittausta siihen olen kulunueen viikon aikana huomannut. Olin harkinnut Clojurea seuraavaksi ohjelmointikieleksi johon tutustua, ja tein alustavaa kartoitusta siitä mikä minua odottaisi. Tajusin, että Clojure tuntuu vieraalta vain Lisp-syntaksinsa vuoksi, minkä vuoksi olen mielessäni sulkenut sen pois “normaalien” ohjelmointikielten joukosta.
Olen pitkään etsinyt itselleni mieluista työkalua selainpohjaisten sovellusten tekemiseen, sellaista vielä löytämättä. Lähimmäksi lienee päässyt Node.js -framework DerbyJS, mutta se on ollut hieman turhan nopeasti liikuva maali minun makuuni. Toinen ehdokas on ollut Scala.js. Olen säännöllisesti palannut Scalan pariin, mutta hieman turhautunut mm.ide- ja versioyhteensopivuusongelmiin.
Haluan jotain uutta.
Harjoitusprojekti
Paras tapa oppia uutta on ajankohtainen, itseä kiinnostava ja itse valittu sovelluskohde.
Yksi houkuttelevista asioista Clojuressa oli JavaScriptia tuottava ClojureScript ja React.js:n päälle rakennettu Om-kirjasto reaktiiviseen ohjelmointiin. Aloitin Om-kirjaston tutoriaalilla ja proof-of-conceptina porttaamaan erästä keskeneräistä Derby-projektiani. ClojureScript-tutoriaalista opettelin Clojuren syntaksia ja perustietorakenteiden käyttöä. Om-kirjaston kanssakin pääsin jo alkuun, mutta tarvitsin ensin jotain tutumpaa.
Päätin lämmittelyharjoituksena ensin portata Julialla tekemäni blogigeneraattorin Clojurelle. Hyvät palikat löytyivät helposti kevyellä googletuksella: Ring (HTTP), Compojure (routing), Enlive (template), Yesql (kevyt SQL) sekä Leiningen (projektin ja rippuuvuuksien hallinta). Eniten päänraavintaa aiheutti Enliven template-tyyli, vaikka css-valitsimiin ja dom-muunnoksiin olin jo aiemmin törmännyt Scala/Lift -kehityksessä. Muuten sain homman tehtyä melkeinpä kirjastojen readme-ohjeiden avulla.
Tämä blogi generoituu nyt Clojurella.
Juliasta Clojureen
Viime vuoden uusi kieli oli Julia, jolla tämänkin blogin aiemmin generoin. Haaveilin sen yhdistävän kaksi pääaluettani, webin ja datan. Ehkä se vielä jonain päivänä sen tekeekin, mutta en jää pidättämään hengitystäni. Julian kanssa näin mahdollisuuksia tulevaisuudessa. Clojuren kanssa koin käytännön hyödyt ensikokeilulla. Vertailu ei tietenkään ole reilu, sillä Julia on vielä beta-vaiheessa. Clojure on kuitenkin webialustana yksinkertaisesti valovuosia sitä edellä, enkä minä taida nyt olla se oikea henkilö raivaamaan Julia-latua eteenpäin. Clojuren soveltuvuudesta datan käsittelyyn ja analysointiin en vielä osaa antaa arviota.
Paluu funktionaaliseen kieleen oli myös tervetullut muutos. Julia tukee funktionaalistakin tyyliä, mutta käytännössä ohjelmointi on pitkälti imperatiivista, päämotivaationa optimaalinen suorituskyky. Blogin Clojure-version koodissa ei ole tällä hetkellä yhtään muuttujaa, enkä missään vaiheessa vielä edes kaivannut sellaisia. Funktionaalisuus sinänsä oli jo ennestään tuttua. Scalaa on tullut koodattua ja Haskelliakin vähän ihmeteltyä. Olen aikoinaan koodaillut koulussa Lisp-johdannaista Schemeä, mikä varmasti nopeutti omaksumista. Ei se niin vieraalta lopulta tuntunutkaan.
Kokemus
Hurahdin nopeasti hommaan ja pian huomasin asentaneeni Emacsinkin taas koneelleni. Tärkeimmät näppäinyhdistelmät palasivat 15v tauon jälkeenkin hämmentävän nopeasti mieleen. Aikoinaan en Schemestä varsinaisesti innostunut, mutta nyt Clojuren kanssa kävi toisin. En edes muista milloin minulla on viimeksi ollut yhtä kivaa ohjelmoidessani.
Oppimiskokemuksena Clojure on ollut hyvin positiivinen yllätys. En ole minkään muun kielen kanssa päässyt yhtä nopeasti vauhtiin ja tuottavaksi. Toki uusien kielten opettelu helpottuu kokemuksen myötä muutenkin, mutta työkalujen ja dokumentaation laatu on ollut poikkeuksellista. Kaikki on tähän mennessä ollut yllättävän toimivaa ja valmista.
Linkit
- Clojure
- Simple made easy — Rich Hickey at Strange Loop 2011.
- Om — ClojureScript interface to Facebook’s React
- Om Basic tutorial
- ClojureScript Tutorial — A ClojureScript Programming Language Tutorial for Light Table Users
- DerbyJS — A full-stack framework for writing modern web applications.
- Scala.js — the Scala to JavaScript compiler
- Näyttää jo blogimmalta — Tämän blogin aiempi Julia-setup pääpiirteissään