Clojure узима модеран став о програмирању непроменљивости и непроменљивој структури података. Док је типски систем у потпуности динамичан, недавни напори такође траже спровођење поступног куцања. [9] Clojure охрабрује програмере да буду експлицитни око управљања главнине и идентитета. .[10] Овај фокус на програмирање са непроменљивим вредностима и експлицитна прогресија њеног радног времена конструктима даје за циљ олакшавање развоја јачих програма, нарочито оних вишенитних.
Clojure се успешно користи у индустријама компанија као што су Волмарт[11]Папет Лабс,[12] и других великих софтверских компанија.[13] Годишња Clojure конференција се организује једном годишње широм света, најпознатији од њих је Clojure/conj (источно америчка обала), Clojure/West (западно америчка обала), и EuroClojure (Европа).
Најновија стабилна верзија Clojure је 1.11.1,[14] објављена 11. марта 2022. године. Прво стабилно издање је верзија 1.0, објављена 4. маја 2009. године.[15] Clojure је слободни софтвер објавњен под Еклипс јавном лиценцом.
Историја и развој процеса
Рич Хиклеј је оснивач Clojure прогамског језика.[4] Пре Clojure, развио је дотLisp, пројекат базиран на . НЕТ платформи.[16] Такође је развио јфли[17] (Јава страни језик интерфејс за Common Lisp), ФОИЛ[18] (страно тело интерфејса за Lisp) и Lisp-етс[19] (Lisp-пријатељски интерфејс за Јава Сервлетс). То троје су ранији покушаји да се обезбеде интероперабилности између Lisp-а и Јаве.
Хиклеј је провео око 2 ½ године радећи на Clojure пре него што га је јавно пустио, велики део тог времена радио је искључиво на Clojure без спољног финансирања. На крају овог периода Хиклеј је послао мејл неким пријатељима у ком најављује језик у Common Lisp заједници.
Процес развоја је заједница[8] којом се управља на сајту Clojure заједнице. Сајт садржи планске документације и проблем трагач где може да отклони кварове. Дискусија општег развоја се одвија на Clojure Дев Гугл група. Иако свако може да поднесе извештаје о грешкама и идејама, измене мора потписати контрибутор Clojure,[8] JИРА карте се обрађују од стране тима и коначно Рич Хиклеј одобрава промене.[20]
Clojure приступ до стања карактерише коцепт идентитета,[24] који су представљен као низ непроменљивих стања током времена. Од стања су имутабилне вредности, било који број радника могу да раде на њима паралелно, а конкуренција постаје питање управљања променама из једног стања у друго. У ту сврху,Clojure обезбеђује неколико променљивих референтних типова, од којих свака има добро дефинисане семантике за транзицију између стања.[10][24]
Clojure ради на Јава виртуалној машини и као резултат интегрише са Јава и у потпуности подржава позив Јава кода са Clojure,[32] и Clojure код може бити позван из Јаве.[33] Заједница користи Леининген[34] за аутоматизацију пројекта , пружање подршке за Мавен интеграцију. Леининген се бави управљањем пројеката пакета и зависности и конфигурише Clojure синтаксу.[34]
Као и већина других Lisp-ова, Clojure синтакса је изграђена на Ц-изразима који су прво обрађени у структуре података од стране читаоца пре него што је саставио.[35] Clojure читалац подржава дословно синтаксу за хеш табеле, скупове и векторе поред листа, а то су саставили до поменутих структура директно. Clojure је Lisp 1 и није намењен да буде код компатибилан са другим дијалектима Lisp-а, јер користи сопствени скуп структура података које нису компатибилне са другим Lisp.
Као Lisp дијалекат, Clojure подржава потпроблеме као првокласне објекте, рид-ивил-принт петље, и макро систем.[36] Макро систем Clojure је веома сличан оном у Комон Липсу са изузетком Clojure верзије бекцитат (звани "цитат синтаксе")квалификује симболе са својим именским простором. Ово помаже у спречавању ненамењом имену снимања, као обавезујуће за именски простор-квалификована имена су забрањена. Могуће је да присилити снимању макро експанзију, али то мора бити урађено експлицитно. Цлојуре не дозвољава да корисник дефинише читач макроа, али читалац подржава више ограничен облик синтактичког продужетка. Clojure подржава мултиметоду и интерфејс попут апстракције протоколаl[29] базиран на полиморфизму и типу система података коришћењем рекордса,[37] и обезбеђује високе перформансе и динамичан полиморфизам дизајниран да се избегне проблем израза.
Недавно Clojure је увео читача уређаја дозвољавајући уградњу Clojure and ClojureScript кода у истом простору имена. [14][42] Сензори су додати као начин за састављање трансформација. Сензори омогућавају вишег реда функције као што су карте и преклапају генеретор преко било каквог извор улазних података, како традиционално ове функције раде на секвенци, претварачи им омогућавају да раде на каналима и пусте корисника да дефинише своје моделе за трансдукцију.[43][44][45]
Платформе и популарност
Примарна платформа Clojure је ЈВМ,[5][32] али постоје и друге циљне имплементације. Најзначајнији од њих су ClojureScript,[46] који се наставља на ЈаваСкрипт, и ClojureCLR,[47] потпуни прикључак на Комон Рантајм језику, интероперабилни са . НЕТ екосистемима. Истраживање на Clojure заједници над 1600 испитаника спроведено у 2013. години[48] показало је да 47% испитаника користи оба Clojure и ClojureScript док ради са Clojure. 2014. године тај број се повећао на 55%.[49] Популарни ClojureScript пројекти укључују имплементације Реакт библиотеке као Реагент и Ом.
Clojure се користи за креативно рачунарство, укључујући виртуелну уметност, музику, игре и поезију.[50]
Варијације Clojure језика су развијене за платформе осим:
лас3р,[51] подскуп Clojure који ради на АкшнСкрипт виртуелној машини (Адоб Флеш Плејер платформа)
clojure-py,[52] имплементација Clojure у чистом Пајтону
руж,[53] имплементација Clojure на врху ЈАРВ у Рубију
Користећи јединствен код (Здраво 世 ("свете") користећи ЦЈК код тачку за ту реч):
(println (str "Hello, "\u4e16)); to the console(javax.swing.JOptionPane/showMessageDialognil(str "Hello, "\u4e16"!")); using Java GUI
Безбедно-нитни генератор јединствених серијских бројева (мада као и у многим другим Lisp дијалектима, Clojure има уграђену генсим функцију да интерно користи):
(let [i(atom0)](defn generate-unique-id"Returns a distinct numeric ID for each call."[](swap!iinc)))
Анонимна класа [1]јава.ио[2]вритер да не пише ни на шта, а макро се користи да ућутка све отиске у њима:
(def bit-bucket-writer(proxy [java.io.Writer][](write[buf]nil)(close[]nil)(flush []nil)))(defmacro noprint"Evaluates the given expressions with all printing to *out* silenced."[&forms]`(binding [*out*bit-bucket-writer]~@forms))(noprint(println "Hello, nobody!"))
10 тема манипулише једном заједничком структуром података, који се састоји од 100 вектора а сваки од љих садржи 10(у почетку узастопне) јединствене бројеве. Свака нит онда изнова бира две случајне позиције у два случајна вектора и мења их. Све промене вектора јављају у трансакцијама користећи Clojure софтверску трансакциону меморију система.