Clojure (výslovnost [ˈkloužəːr]) je vinformatice moderní dialekt programovacího jazyka Lisp. Jedná se ouniverzální jazyk podporující funkcionální programování, který se zaměřuje na zjednodušení vývoje vícevláknových aplikací. Clojure používá běhové prostředí JVM nebo CLR, přičemž zastává filozofii kódu, který se chová jako data a implementuje sofistikovaný Lispový makrosystém.
Rich Hickey vyvinul Clojure, protože si přál moderní Lisp spolupracující srozšířenou platformou Java, který by byl navržen pro vývoj vícevláknových aplikací.[2][3]
Clojure používá pro řízení souběžnosti koncept tzv. identit,[4] který si lze představit jako sérii včase neměnitelných stavů. Jelikož tyto stavy mají neměnitelné hodnoty, může nad nimi paralelně operovat jakýkoliv počet vláken a řízení souběžnosti se stává otázkou spravování přechodů zjednoho stavu do dalšího. Pro tento účel Clojure poskytuje 4 měnitelné referenční typy, kde každý má jasně definovanou sémantiku pro přechod mezi stavy.
Jako každý Lisp, syntaxe jazyka Clojure je postavena na s-výrazech, které jsou nejprve rozebrány do datových struktur před tím než jsou zkompilovány. Clojure podporuje literály pro struktury jako seznamy, mapy, množiny a pole, které jsou kompilátoru předány tak jak jsou. Clojure je Lisp-1 a není zamýšleno, aby byl kompatibilní sostatními dialekty Lispu.
Makro je konstrukce, které vargumentech předáme S-výrazy, ze kterých je následně sestaven libovolný kód. Poté se tento kód vykoná.
Systém maker vClojuru je velice podobný kódu Common Lispu.
multimetody poskytují dynamické spuštění metod, jejichž konkrétní implementace je vybrána na základě typu předaných parametrů
jazyk je kompilovaný do JVM bajtkódu
silná integrace sJavou: kód jazyka Clojure kompilovaný do JVM bajtkódu může být snadno nasazený do běžného prostředí JVM a aplikačních serverů bez dalších potíží; jazyk dále poskytuje makra, která usnadňují použití existujících Java API; jeho struktury implementují standardní rozhraní Javy, což umožňuje spouštět kód napsaný vClojure zJavy
Tato třída nikam nezapisuje a obsahuje makro, které umlčí všechno vypisování.
(defbit-bucket-writer(proxy[java.io.Writer][](write[buf]nil)(close[]nil)(flush[]nil)))(defmacronoprint"Vykoná předané výrazy a umlčí všechna vypisování na *out* (standardní výstup)."[&forms]`(binding[*out*bit-bucket-writer]~@forms))(noprint(println"Zdravím nikoho!"))
Následující příklad ukazuje 10 vláken operujících nad společnou datovou strukturou, která se skládá ze 100 vektorů, každý obsahující 10 (zpočátku po sobě jdoucích) unikátních čísel. Každé vlákno vybírá 2 náhodné pozice ve 2 náhodných vektorech a prohazuje je. Všechny změny ve vektorech probíhají vtransakcích spoužitím softwarové transakční paměti, aproto ani po 100000 iteracích každého vlákna se neztratí žádné číslo.
↑Charles. Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure [online]. Microsoft, 2009-10-06 [cit. 2018-02-23]. (Channel 9. Going Deep). Dostupné online. (anglicky)
↑Clojure - Values and Change: Clojure‘s approach to Identity and State [online]. Rich Hickey, 2018-02-21 [cit. 2018-02-23]. Dostupné online. (anglicky)