A Clojure programozási nyelv

Fejlesztőeszközök

A REPL használata

Aki el szeretné kezdeni a Clojure (vagy bármilyen más Lisp nyelv) tanulását, annak meg kell ismerkednie a REPL fogalmával. Lényegében a REPL egy egyszerű konzolos felület, ami a Lisp programozás legfontosabb eszköze. A REPL a "Read-Eval-Print Loop" kifejezésből alkotott betűszó, ami azt jelenti, hogy a REPL felületek a Lisp (mi esetünkben Clojure) read (read-string), eval és print műveleteinek végtelen ciklusát biztosítják számunkra. Ahhoz, hogy Clojure-ben programozhassunk, érdemes feltelepítenünk legalább egy REPL-t.

A Leiningen használata

A Leiningen (röviden lein) egy népszerű eszköz Clojure projektek automazizálására. Számos egyszerűen használható funkciót tartalmaz, amelyek megkönnyítik a projektek kezelését.

A Leiningen telepítéhez egy shell szkriptet kell letölteni és futtatni. Ez ellenőrzi a megfelelő java verziók meglétét, és letölti, majd telepíti a legfontosabb programokat.

Új projekt létrehozásához futtassuk a lein new projektnév parancsot. Ez egy új munkakönyvtárat hoz létre. A könyvtárban található src mappa tartalmazza a projektünk forrásfájljait. Ez már tartalmaz is egy src/projektnév/core.clj nevű forrásfájlt. A test mappa az egységtesztek forráskódjait tartalmazza. A target mappa tartalmazza a projekt fordításakor és futtatásakor létrejövő fájlokat, mint például a generált osztályok fájljait. A README.md egy markdown fájl, amibe a projekt dokumentációját írhatjuk.

A leinnel létrehozott projektek legfontosabb állománya a projekt könyvtárában található project.clj fájl. Ez maga is egy futtatható Clojure program, ami a projekttel kapcsolatos részleteket tartalmazza kulcs-érték párok formájában, melyek közül a legfontosabbakat a következőkben részletezzük.

A project.clj az új projektünk nevén és verziószámán kívül tehát tartalmazza a projekt rövid leírását, a szükséges legkisebb leiningen verziót (:min-lein-version), a projekt web címét (:url), a tesztfájlok helyét (:test-paths), a projektünk licenc leírását, és a függőségeket (:dependencies).

A függőségek leírása más projektek név és verziószám-párjai. A legfontosabb ezek közül a szükséges Clojure verzió szerepeltetése, ami már az újonnan létrehozott projekt leírásában is megtalálható.

A Leiningen jól használható a projekt függőségeinek kezelésére. A szükséges függőségeket sok forrásból képes összegyűjteni, mint például Java projektek esetén a Maven Central, Clojure projektek esetén a Clojars, de használhatunk saját forrásokat is.

Miután a project.clj fájlba felvittük a projektünk függőségeit, frissíteni kell a projektet a lein segítségével. Ehhez adjuk ki a lein deps parancsot, ami letölti a szükséges csomagokat és beállítja a szükséges környezeti változókat.

A forrásfájlok konvenció szerint a src/projektnév mappába kerülnek, minden névtér a neve szerinti .clj fájlba. Ha egy névtér tartalmát több fájlra szeretnénk lebontani, azokat tegyük a névtér nevének megfelelő nevű könyvtárba. Ebben az esetben egy file tartalmazza az (ns) makrót, a többi fájl elején az (in-ns) makró szerepeljen. A fájlok a (load) meghívásával hivatkozhatnak egymásra. Ha egymásba ágyazott névtereket szeretnénk használni, ennek megfelelően egymásba ágyazott könyvtárstrukturában helyezzük el a forrásfájlokat is.

A fejlesztéshez használhatjuk a Leiningen NREPL-t, vagyis a hálózati REPL-t. Ez egy socket szervert indít, amihez a fejlesztői környezetek csatlakozni tudnak, de a felhasználó is kap egy interaktív REPL-t.

A megírt projekt futtatásához adjuk ki a lein run parancsot. A projekt fordítása a lein compile parancsra történik. A gyakorlatban azonban sokszor hasznosabb, ha a lefordított programot rögtön egy .jar kiterjesztésű fájlba be is csomagolja a program, erre szolgál a lein jar parancs. Az így létrehozott csomag még nem tartalmazza a futtatáshoz szükséges összes állományt, egy ilyen file elkészítéséhez adjuk ki a lein uberjar parancsot. Az utóbbi két parancs létrehozza a target mappában a megfelelő jar fájlokat.

A tests mappában található egységtesztek futtatásához adjuk ki a lein test parancsot. Ekkor az összes tesztesethez tartozó kód végrehajtódik, majd a futás befejeztével egy részletes statisztikát kapunk a helyesen és a hibásan lefutott tesztesetekről.

A Clojure fejlesztő munkáját tovább egyszerűsítheti a Leiningen pluginek használata. Ma már nagy számban léteznek kiegészítések, amelyek a fejlesztés minden aspektusára kiterjednek. Ezekről egy lista található a projekt github oldalán.

Népszerű Clojure és Lisp REPL eszközök

Kezdőknek talán a legegyszerűbb eszköz a cljr REPL, ami elérhető a github.com/liebke/cljr oldalon. A telepítése egyszerű, a program támogatja a vágólap használatát, ezenkívül a cljr a projekt-alapú fejlesztésre lett kitalálva: jól integrálódik a Leiningen build-automatizáló szoftverrel (a cljr maga is azt használja). Így, a Leiningen révén leegyszerűsödik a Clojure könyvtárak telepítése is, amiket a népszerű Clojars repository-ból könnyen telepíthetünk.

Akiket zavarnak a Lisp-kódok gyakran elburjánzó zárójelei, azok használhatják a profi Lisp-fejlesztők által is előnyben részesített emacs-ot a SLIME kiegészítővel. Az emacs kiemeli a zárójelpárokat, használható a vágólap, a keresés funkció, van beépített debugger, szintaxisellenőrző, külön hibaablak, stb. Az emacs ezenkívül maga is programozható Lisp nyelven - az Emacs Lisp viszont nem kompatíbilis a Clojure-rel. Az emacs ellen szól az eszköz magas tanulási görbéje, valamint az, hogy kezdők számára még a megfelelő környezet beállítása is gondot jelenthet. Utóbbi problémán segít Windows felhasználók számára a Clojure Box, ami egy teljesen Clojure fejlesztésre beállított Windows operációs rendszerre telepíthető emacs környezet (SLIME kiegészítővel). A Clojure Box letölthető a clojure.bighugh.com oldalról, de tartsuk szem előtt, hogy a Clojure Box-ot már nem fejlesztik tovább, így az újabb verziók már nem települnek automatikusan a Clojure Box telepítővel.

Linux felhasználók számára az Emacs Live projekt egy jól használható és aktívan fejlesztett csomag, amely tartalmazza a legfrissebb clojure fejlesztői kiegészítéseget az Emacs szövegszerkesztőhöz. Sok kiegészítőt tartalmaz, és külön támogatja a Quil és Overtone live-coding eszközöket. A felhasználó beállításai pedig csomagokba szervezve, jól elkülönítve szerkeszthetők.

Hasonlóan jó választás lehet még az Eclipse kedvelőinek a Counterclockwise plugin, ami lehetővé teszi a Clojure fejlesztést Eclipse alól. Van benne Leiningen-integráció; többféle, teljesen testre szabható kódszínezési lehetőség ("hagyományos", illetve rainbow paren); a szerkesztőben ezenkívül használhatunk "sima" vagy akár az emacs-ból megszokott paredit módot is; tartalmaz kódnavigációs eszközöket (függvénydefinícióhoz ugrás); automatikus indentációt, Eclipse-be épülő projekt-, illetve forrásfájl-szintű REPL-t, névtér-böngészőt, debuggert (elhelyezhetők breakpointok, illetve beledebuggolhatunk a Clojure függvények Java implementációjába is), valamint tartalmaz egy egyelőre még kezdetleges kódkiegészítési módot is.

Az IntelliJ fejlesztői környezetet használók számára hasznos a Cursive Clojure plug-in. A kereskedelmi forgalomba szánt eszköz jelenleg is korai tesztelési fázisban van.

A Netbeans felhasználói számára az Enclojure plugin biztosít clojure támogatást. Sok más népszerű fejlesztői környezethez létezik már clojure mód, a legfontosabbak közt van a JEdit, a Textmate, és a Visual Studia a .Net CLR támogatással.

Viszonylag új eszköz a Nightcode nevű fejlesztőkörnyezet. A program nagy részét Clojure nyelven írták, és a java grafikus felületét használja. A program a cikk írásakor még korai stádiumban volt, ám az alapfunkciókkal rendelkezik, és máris nagyon ígéretes. Talán legfontosabb előnye a Clojure projektek beépített kezelése. A program több sablont is nyújt új projektek indításához. Így létrehozhatunk külön parancssoros, webes, vagy grafikus alkalmazást is. A Java virtuális gép mellett lehetséges vele iOs, .Net és Android rendszerekre is fejleszteni. Szintén érdemes megemlíteni az egyre népszerűbb beépített ClojureScript támogatást is. Ezen lehetőségek nagy részét a tőle függetlenül fejlesztett leiningen plugin-eken keresztül éri el, talán ennek köszönheti a gyors fejlődését és a növekvő sikerét.

Az utóbbi időben a legnagyobb figyelmet egy új játékos, a Light Table nevű fejlesztői környezet kapta. A projekt az alapvető szerkesztői funkciókon túl teljesen újszerű fejlesztői élményt ígér. A ClojureScript nyelven írt program már támogatja a Python és JavaScript nyelveket is. A fejlesztők célja egy olyan eszköz készítése volt, amivel a program belső állapota és hatásai futás közben nyomon követhetők, ezt pedig a REPL nagyfokú integrációjával érik el.