Om du är van att programmera objektorienterade språk som Java och C# så kan det funktionella språket Clojure verka förvirrande. Låt det inte avskräcka. Patrik Fredriksson förklarar varför Clojure är mödan värt att lära sig.

Clojure är ett av de många nya JVM-språk som börjar få fotfäste bland utvecklare. Som Lisp-dialekt så skiljer sig dock Clojure ganska mycket från många andra språk, och programmerare med Javabakgrund verkar inte sällan uppleva språket så pass annorlunda att de instinktivt ryggar tillbaka. Det är lite synd tycker vi på Citerus då det finns många bra anledningar att titta närmare på Clojure. Några av de frågor jag ganska ofta får när jag föreläser eller hamnar i samtal runt språket är funderingar runt varför man ska använda Clojure. Vad man ska ha det till? Vad är det bra på?

På Jfokus 2009 fick jag frågan vad det var med just Clojure som gjort att jag fastnade för språket. Svaret blev då spontant ganska känslobaserat. Första gången jag kom i kontakt med Clojure var under en presentation av Rich Hickey, och det var något i språket som i stort sett omedelbart tilltalade mig. Minnen från gamla universitetskurser i ML kom tillbaka. Elegansen i den funktionella programmeringsmodellen blev tydlig.

Jag laddade direkt ner Clojure och började utforska språket. Jag fick den känsla som jag tänker mig att många personer som fastnat för Ruby har; en känsla av att allt på något sätt känns naturligt och det blir omedelbart oerhört kul att programmera igen. Jag lyckades aldrig frambringa denna passion för Ruby trots att jag verkligen försökt flera gånger. Men med Clojure så kändes väldigt mycket rätt, även om inlärningströskeln inte på något sätt varit låg. Trots att verktygen är relativt primitiva, utbudet av bibliotek och tredjepartskomponenter liten och mycket måste skrivas från början så kunde jag komma långt på kort tid. Det var kul, och jag kände mig produktiv. Dessutom var Clojure-gemenskapen väldigt välkomnande och hjälpsam.

Nu tenderar rent känslomässiga argument kanske att fungerar lite sämre som beslutsunderlag för att få en organisation att ta till sig ny teknik och nya arbetssätt. Det får helst finnas andra argument, som upplevs lite mer rationella. Som tur är så saknas det inte argument av den typen för Clojure.

Utrycksfullhet

Clojure är uttrycksfullt och i grunden designat för att vara enkelt. Detta ger ett väldigt kraftfullt språk där mycket som kan upplevas som onödig ceremoni tagits bort. Det låter oss lägga fokus på det faktiska domänproblemen, och gör att vi mer effektivt kan styra bort från teknisk komplexitet. De funktionella aspekterna av Clojure, så som stöd för högre ordningens funktioner, bidrar även de till att språkets uttrycksfullhet.

Java som plattform

Genom att köra på JVM:en finns en robust och effektiv exekveringsmiljö redan på plats som är extremt väl spridd och accepterad. Genom sömlös integration med Java finns möjlighet att nyttja redan existerande tredjepartskomponenter, samtidigt som nyutvecklad Clojurekod enkelt kan integreras med existerande lösningar och miljöer. Clojure finns nu även i en version för exekvering på JavaScript-tolkar, ClojureScript.

Samtidighet

Det som ofta framförs som en viktig del av Clojures tänkta tillämpningsområde, är parallellisering och hantering av samtidighet. Under de senaste åren har utvecklingen mot snabbare och snabbare processorer bytts mot en utveckling som går mot fler och fler kärnor. En modern bärbar dator av i dag kan ofta vara bestyckad med en fyrkärnig processor, inte sällan med någon form av hyper-threadingteknik. Till och med telefoner och surfplattor kommer idag med flerkärniga processorer. Man kan argumentera för att många befintliga språk, så som Java, är mindre lämpade för att skapa de program som krävs för att till fullo utnyttja den kapacitet som flerkärniga processorer erbjuder.

Clojure är designat runt den funktionella programmeringsparadigmen. Datastrukturerna är persistenta, oföränderliga, och det finns en fullständig tanke runt identitet, tillstånd och tid. Bara det att man arbetar med icke muterbara datastrukturer hjälper långt i att hantera samtidighet. En icke muterbar datastruktur är trådsäker.

Funktionell programmering

Clojure är ett programmeringsspråk för funktionell programmering. Funktionell programmering är till stor del deklarativ, det låter oss fokusera på vad vi vill göra framför hur det ska göras. Stöd finns förstås i språket för högre ordningens funktioner, och datastrukturerna är icke muterbara. Att datastrukturer inte går att förändra efter att de är skapade, tillsammans med fokuseringen på rena funktioner, gör mycket för att hålla ner komplexiteten i program och underlätta parallellisering. Inom Domain-Driven Design förespråkar vi använding av värdeobjekt mycket på grund av detta, men det är svårt att få till i språk som Java. I Clojure får vi det som en integrerad del av språket.

Lisp

Många har starka åsikter om Lisp. Förutom ett par rader som jag klistrade in min .emacs-fil tidigt under våren 1996 hade jag ingen tidigare erfarenhet av Lisp innan jag kom i kontakt med Clojure. Släktskapet med Lisp gör Clojure annorlunda, och med det kommer några riktigt spännande möjligheter.

“Data som kod”, eller homoiconicity, och makron är ett par koncept som är starkt förknippade med Lisp. Det är koncept som kanske inte är helt enkelt att vrida sin hjärna runt, men när man väl börjar förstå vad det är och hur det kan användas så öppnas helt nya möjligheter. En konsekvens av denna egenskap, och att Clojure numera går att exekvera både på JVM:en och i en JavaScriptmiljö, är att vi kan använda samma språk för att uttrycka klientkod, serverkod och den data som flyttas mellan klient och server utan behov av mellanformat så som JSON eller XML.

Om du ännu inte kikat på Clojure så är det verkligen något som jag kan rekommendera Bli inte avskräckt över att det ser så annorlunda ut. Särskilt om du, som jag, har varit helt inne i en objektorienterad värld de senaste åren så är det ett fantastiskt sätt att vidga sina vyer och få nya perspektiv!

Ett urval av länkar