Clojure je moderním dialektem programovacího jazyka Lisp. Jde o univerzální jazyk, který podporuje funkcionální programování. Zaměřuje se především na zjednodušení vývoje vícevláknových aplikací. Pro svůj chod využívá běhové prostředí JVM nebo CLR. Drží se filozofie kódu, který se chová jako data a implementuje sofistikovaný makrosystém Lispu.
Rich Hickey se rozhodl vyvinout Clojure, protože potřeboval moderní Lisp, který by spolupracoval s rozšířenou platformou Java a který by byl navržen pro vývoj vícevláknových aplikací.
Clojure pro řešení řízení souběžnosti využívá konceptu takzvaných identit. Ty si lze představit jako sérii v čase neměnitelných stavů. Vzhledem k tomu, že mají tyto stavy neměnitelné hodnoty, je možné nad nimi paralelně operovat libovolný počet vláken a samotné řízení souběžnosti pak spočívá ve spravování přechodů z jednoho stavu do jiného. Za tímto účelem Clojure poskytuje čtyři měnitelné referenční typy, z nichž každý má jasně danou sémantiku pro definici přechodů mezi jednotlivými stavy.
Po vzoru Lisp je syntaxe jazyka Clojure postavena na s-výrazech, které jsou nejprve rozebrány na úroveň datových struktur a následně zkompilovány. Clojure zároveň podporuje literály pro struktury, jako jsou například seznamy, mapy, množiny nebo pole. Ty jsou následně kompilátoru předány tak, jak jsou. Clojure není navržen tak, aby byl kompatibilní s ostatními dialekty Lispu.
Makra
Makra hrají v Clojure zásadní roli. Jedná se o konstrukci, které jsou v argumentech předány S-výrazy, ze kterých je následně sestaven libovolný kód. Ten se poté vykoná. Systém maker je v Clojuru dosti podobný konceptu kódu v Common Lispu.
Typické vlastnosti Clojure
Vývoj je dynamický s využitím REPL
Funkce jsou first-class objekty, které kladou důraz na rekurzi oproti smyčkám, které vytvářejí postranní efekty.
Sekvence jsou líně vyhodnocované.
Dává k dispozici bohatou sadu neměnitelných datových struktur.
Je silně integrovaný s Javou. Kód jazyka je kompilovaný do JVM bajtkódu. Díky tomu může být jednoduše nasazen do běžného JVM prostředí a aplikačních serverů. Jazyk zároveň poskytuje makra, která zjednodušují použití existujících Java API; jeho struktury přímo implementují standardní rozhraní Javy, čímž je možné spouštět kód napsaný v Clojure přímo z Javy.
Umožňuje souběžné programování za využití softwarové transakční paměti, agentového systému a dynamického typového systému.
Dynamické spuštění metod umožňují multimetody, jejich konkrétní implementace je vybírána na základě typu předaných parametrů.
Výhody používání Clojure
Jednoduchost a elegance. Clojure je jednoduchý a elegantní jazyk, kde většina funkcionalit potřebuje méně kódu nežli v jiných jazycích, což zvyšuje produktivitu a tároveň snižuje riziko chybovosti.
Bezpečnost. Bezpečnost je zvýšena díky neměnnosti, vysoké úrovni smyček a manipulace s daty, konstrukcí konkurenčnosti a mantrám funkcionálního programování, které dbá na čistotu.
Výkon. Výkonnost je na srovnatelné úrovni jako Java a struktura jazyka podporuje ve psaní výkonného kódu tím, že zpřístupňuje širokou škálu vysoce optimalizovaných datových struktur. Má rovněž podporu rychlého zpracování ve více vláknech.
Nevýhody práce s Clojure
Paměť. Není příliš efektivní v práci s pamětí, čímž zvyšuje náklady na hardware, protože vyžaduje servery se značnou pamětí.
Náročnost na učení. V počáteční fázi je velice náročné se v jazyce zorientovat, čímž může mnoho vývojářů odradit.
Responzivnost. Clojure nelze použít pro služby v reálném čase.
Náročná spolupráce mezi vývojáři. Pro větší týmy může být náročné pracovat na společném kódu.
Méně čitelné chybové zprávy.
Není vhodný pro vysoce výkonný nízkoúrovňový kód. Pro takové případy je vhodnější zvolit C, C++, Rust nebo Assembly.