Lisp-kirjoja

Listataanpa lukemiani Lisp-aiheisia kirjoja koosteeksi.

Michael Fogus, Chris Houser: The Joy of Clojure (2011)

Vaikka tämä ei olekaan yleinen konsensus, Joy of Clojure sopii hyvin kielen oikkujen oppimiseen. Etenkin jos Clojuresta on jo pientä kokemusta web-tutoriaalien pohjalta. JoC on kirjoitettu osittain teoreettisesta näkökulmasta ja osittain käytännönläheisestä Clojure-hakkailusta. Totisesti, tässä kirjassa on laaja paketti erilaisia sovelluksia, ja antaa hyvät maistiaiset siihen, mitä lisp-kielellä voi oikein tehdä.

Amit Rathore: Clojure in Action (2011)

Rathoren Clojure-kirja saattoi olla vuonna 2011 hyvä katsaus Clojuren käytännöllisempään puoleen, mutta kirjoitustyyli ja koodi oli hieman puuduttavaa omaan makuuni. Emerickin Clojure Programming kuittaa likipitäen tämän kirjan kokonaan.

Chas Emerick et al: Clojure Programming (2012)

Tämä kirja on taasen vahva yleisteos, suorastaan referenssi kaikkiin Clojure-asioihin. Python-maailmassa Lutzin Programming Python toimii vastaavana järkäleenä. Referenssi, joka toimii ihan taidokkaasti kirjoitettuna oppikirjana. Paljon asiaa on kyllä, joten kaikkea ei ehdi nauttia yhden lukukerran aikana.

Peter Seibel: Practical Common Lisp (2005)

Common Lisp tuntuu Clojuren jälkeen hieman vanhalta, ja onhan se tietysti sitäkin. Ainakin pari vuotta sitten vielä kuitenkin keskusteltiin paljon siitä, onko Clojuren säkissä yhtäkään oikeasti uutta ideaa, jota ei CL:ssä olisi ainakin joskus nähty. Siitä syystä nyt aloitin hiljan tutustumisen CL:n maailmaan. Seibelin kirja on ilmaisessa verkkojakelussa, ja ainakin suosittelen ensipuoliskoa yleistason CL-kirjoitteluun. Luvun 9 nopea, funktionaalinen testiympäristö on erinomainen tapa näyttää makrojen taika.

Jälkimmäisellä puolella Seibel kuitenkin siirtyy enemmän ja enemmän oliopohjaisiin ajatuksiin. Introduktio Common Lispin olio-ominaisuuksiin (CLOS) on toisaalta erittäin tervetullut, ja valaisevakin. Kaikki ideat, mitä Alan Kay teki oikein Smalltalkissa ja mitkä tehtiin Javassa ja C#:ssa väärin, ovat esillä. Common Lisp antaa vapaat kädet tehdä likipitäen sitä, mitä haluaa olioiden kanssa.

Mutta loput esimerkit ovat sitten liiaksi oliokeskeisiä. Tämä tietysti käy niille, ketkä nauttivat olioista. Funktionaalista ohjelmointia PCL ei opeta, eikä sen tarvitsekaan. Onhan Common Lisp enemmän moniparadigmainen kuin funktionaalinen kieli.

Conrad Barski: Land of Lisp (2010)

Barskin LoL on vähiten akateeminen kirja näistä kaikista, ja muutamia pieniä virheitä tai epätäsmällisyyksiäkin olen huomannut. Tämä kirja on todella hulvaton, kuitenkin, ja opastaa nätisti Common Lispin saloihin satunnaisten peliprojektien ja teoriaosuuksien lomitellessa toisiaan.

Land of Lisp on tuore tapaus Common Lisp -kirjallisuuden maailmassa, ja ihan taidokas työ. Makrot ja kaikki sellainen käydään riittävällä tasolla ja selkeästi havainnollistettuna. Seibelin kirjaan nähden Barski ottaa funktionaalisen lähestymistavan kirjan loppupuolella käyttöön, ja tekee sillä ihan mukavia teknisiä algoritmeja. Minimax-algoritmeja ja α-β-pruunausta. Barski esittelee myös muita Common Lisp -idiomeja, ja kirja on ollut kaikkinensa oiva luenta. Tulikin ahmittua aikamoista vauhtia.

Paul Graham: On Lisp (1994)

Paul Grahamin On Lisp (vapaasti luettavissa linkin takaa) on syventävä työ Common Lispillä tehtäviin ratkaisuihin. Kirjassa Graham esittelee case-pohjaisia ongelmia, ja idiomaattisia tapoja toteuttaa ne CL:llä. Tutustutaan esimerkiksi hahmonmätsäykseen, epädeterministisiin mekanismeihin ja oliohierarkioiden luomiseen. Sivussa syntyy esimerkiksi täysin toimiva Prolog-klooni. Graham kannustaa tekemään funktionaalista koodia, mutta toisaalta käytetyt tekniikat ovat vahvasti makropohjaisia, joita on hankalampi yhdistellä.

Makroilla tehdään paljon. Kaksikymmentä vuotta sitten tietokoneet olivat hitaampia, joten makrojen esikääntöominaisuuksille oli varmasti enemmän käyttöä silloin. Clojuressa ei lainkaan painoteta makroja näin paljoa, ja syynä tähän on varmasti ensinnäkin yhdisteltävyyden ylläpito ja yhtenäisyys siltä osin. Ja nykykääntäjät (clojuren tapauksessa) osaavat toki tehdä JIT-kääntöä, mikä nopeuttaa.

Tiiviissä luvuissa ehditään tehdä kyllä paljon. Kontinuaatioita, laiskaa suoritusta ja takaisinkelaavaa suorituspolun etsintää. Graham perustelee kyllä syitä makrojen käytölle (ja lisäksi esittää tehokkaan makron makrojen yhdistelyä helpottamaan). Makroraamatuksi tituleerattu työ ei petä tältä osin.

Daniel P. Friedman, Matthias Felleisen: The Seasoned Schemer (1995)

Jatkoa Little Schemerille, jota en koskaan lukenut. Tämä kirja on esitetty ensimmäisen osansa tapaan kiinnostavasti sokraattisena keskusteluna, jossa osapuolet tulevat valoon kielen hienouksista. Hyvä työ, jota en muistanut mainita, vaikka nämä on luettu joskus vuosia sitten. The Little Schemer on suositeltavaa lukemista, tämä on vähän niin ja näin.

Daniel P. Friedman et al: The Reasoned Schemer (2005)

Ei varsinainen jatko-osa, vaan pikemminkin liite aiemmille Friedmanin töille: kirjassa luodaan käytyjen keskusteluiden voimin logiikkamoottori schemelle. Prologia hieman muistuttava miniKanren-systeemi on helppo toteuttaa ja samalla oppii likaisia kikkoja minimaalisesta schemestä! Schemen oppimisen sijaan tämä on hyvä työ oppia logiikkaohjelmoinnin perusidea; monesti se helpompi tapa oppia relaatioista jotain. Onhan se vähän vierasta, joten jos sen oppii taustalla piilevistä imperatiivisista ja funktionaalisista rakenteista, aina parempi!

Mitä muuta tulossa?

Näillä näkymin Common Lisp saa riittää. Clojure-puolella on ainakin Hallowayn "Programming Clojure" ja sitten on Stuart Sierran "Practical Clojure", joita en ole lukenut/silmäillyt kannesta kanteen. En välttämättä luekaan, koska ovat aika vanhoja kirjoja ja vähän on kuultu mitään kehujakaan. Uusia Clojure-kirjojakin on, kuten "Clojure Cookbook" ja joku tilastojuttuja tekevä kirjanen on myös. Nämä eivät ole kamalan kehuttuja opuksia, enkä usko, että opin kamalasti niistä enää.

Jonkinlainen "On Clojure" voisi olla varteenotettava tässä vaiheessa: kirja, jossa paneudutaan tosissaan suuren järjestelmän ylläpitoon Clojurella. DSL:t ja makrot ja funktionaalinen ote. Hickeyn tapaan painopiste saisi olla yksinkertaisen systeemin rakentamisessa.

SICP:tä olen lukenut ensimmäisen neljänneksen verran. Ehkäpä jatkan sitä sitten schemennälkääni. Toisaalta SICP:stä ei ole tyydyttävää Kindle-versiota olemassa, ja katkotut koodirivit ovat perin ikäviä.

Päivitin tätä listaa muutamaa vuotta myöhemmin. Olen pettymyksekseni jättänyt teknisen kirjallisuuden sikseen ja lueskellut vain harvakseltaan muutenkin nyt. Vaikea uskoa, että näistä lukukokemuksista on jo 2,5 vuotta ja enemmän!


Kommentit, kehitysehdotukset ja keskustelunavaukset ovat tervetulleita sähköpostitse.