Clojure
![]() Clojure | |
Парадигма | функционална |
---|---|
Првобитни програмер(и) | Рич Хиклеј |
Прва верзија | 2007;пре 8 година |
Најновија верзија | 1.11.1[1] |
Дисциплина куцања | динамична, снажна |
Платформа | ЈВМ, ЦЛР, Јаваскрипт |
Лиценца | Јавна Еклипс лиценца |
Екстензије | .clj, .cljs, .cljc, .edn |
Веб-сајт | clojure |
Под утицајем | |
Common Lisp, Erlang, Haskell, ML, Prolog, Scheme, Java, Ruby[2] | |
Утицао на | |
Elixir, Pixie, Rhine |
Clojure (изговор: кложур, као енгл. closure - "затварање"[3]) је дијалект Lisp програмског језика који је створио Рич Хиклеј .[4] Clojure је програмски језик опште намене са нагласком на фунционалном програмирању.[5] То ради на Јава виртуелној машини, ЦЛР,[6] и ЈаваСкрипт машинама. Као и други Lisp-ови, Clojure се третира као код података и има макро систем.[7] Садашњи процес развоја заједнице,[8] је надгледао Рич Хиклеј као њен БДФЛ.
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 је слободни софтвер објавњен под Еклипс јавном лиценцом.
Историја и развој процеса
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Rich_Hickey.jpg/220px-Rich_Hickey.jpg)
Рич Хиклеј је оснивач 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 јер је желео модеран Lisp за функционално програмирање, симбиозу са утврђеном Јава платформом, а дизајниран за конкуренцију.[21][22][23]
Clojure приступ до стања карактерише коцепт идентитета,[24] који су представљен као низ непроменљивих стања током времена. Од стања су имутабилне вредности, било који број радника могу да раде на њима паралелно, а конкуренција постаје питање управљања променама из једног стања у друго. У ту сврху,Clojure обезбеђује неколико променљивих референтних типова, од којих свака има добро дефинисане семантике за транзицију између стања.[10][24]
Карактеристике
Верзија | Датум изласка | Додате главне карактеристике |
---|---|---|
2007-10-16[25] | иницијална јавна издања | |
1.0 | 2009-05-04[26] | прва стабилна издањаs[27] |
1.1 | 2009-12-31[26] | Будућиs[28] |
1.2 | 2010-08-19[26] | Протоколиs[29] |
1.3 | 2011-09-23[26] | Енхејнсед примитивна подршка [30] |
1.4 | 2012-04-15[26] | Читачи литерали |
1.5 | 2013-03-01[26] | Редуктори |
1.6 | 2014-03-25[31] | Јава АПИ, побољшани кеширани алгоритми |
2015-06-30[14] | Претварачи, читачи кондиционали | |
будућа издања |
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 има подршку за лење секвенце и подстиче принцип непроменљивости и упорних структура података. Као функционалном језику, акценат је ставњен на рекурзију и виши ред функције уместо споредног ефекта базе петље. Аутоматска репна рекурзија није подржана као ЈВМ не подржава природно [38] па је могуће да се то уради експлицитно помоћу понављања рекур кључне речи.[39] За паралелну обраду и паралелно израчунавање Clojure обезбеђује софтвер трансакцију меморије [40] реактиван додатак система,[41] and канал заснован на истовременом програмирању.
Недавно 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 на врху ЈАРВ у Рубију
- ЦљПерл,[54] имплементација Clojure на врху Перла.
Примери
(println "Hello world!")
Дефинисање функције:
(defn square [x] (* x x))
ГУИ "Здраво свете" позивом Јава Свинг библиотеке :
(javax.swing.JOptionPane/showMessageDialog nil "Hello World" )
Користећи јединствен код (Здраво 世 ("свете") користећи ЦЈК код тачку за ту реч):
(println (str "Hello, " \u4e16)) ; to the console (javax.swing.JOptionPane/showMessageDialog nil (str "Hello, " \u4e16 "!")); using Java GUI
Безбедно-нитни генератор јединствених серијских бројева (мада као и у многим другим Lisp дијалектима, Clojure има уграђену генсим
функцију да интерно користи):
(let [i (atom 0)] (defn generate-unique-id "Returns a distinct numeric ID for each call." [] (swap! i inc)))
Анонимна класа [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 софтверску трансакциону меморију система.
(defn run [nvecs nitems nthreads niters] (let [vec-refs (->> (range (* nvecs nitems)) (partition nitems) (map (comp ref vec)) vec) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [tmp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 tmp)))) report #(let [derefed (map deref vec-refs)] (prn derefed) (println "Distinct:" (->> derefed (apply concat) distinct count)))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000)
Излаз из претходног примера:
([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ... [990 991 992 993 994 995 996 997 998 999]) Distinct: 1000
([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] ... [484 216 622 139 651 592 379 228 242 355]) Distinct: 1000
Види још
- Листа ЈВМ језика
Референце
- ^ „Кложур издање 1.11.1”. 22. 3. 2022. Приступљено 17. 11. 2022.
- ^ „Clojure Programming” (PDF). Приступљено 2013-04-30.
- ^ "meaning and pronunciation of Clojure".
- ^ а б "Clojure inventor Hickey now aims for Android".
- ^ а б "Clojure - home". clojure.org
- ^ "clojure/clojure-clr".
- ^ "Clojure - lisp". clojure.org
- ^ а б в "Contributing FAQ - Clojure Community - Clojure Development" Архивирано на сајту Wayback Machine (20. новембар 2015). dev.clojure.org
- ^ "clojure/core.typed".
- ^ а б "Clojure - state". clojure.org
- ^ "Walmart Runs Clojure at Scale"
- ^ "A New Era of Application Services at Puppet Labs" Архивирано на сајту Wayback Machine (25. октобар 2015).
- ^ "Clojure Programming Language :: Cognitect, Clojure Consulting, Clojure Support, Functional Programming, JVM" Архивирано на сајту Wayback Machine (19. септембар 2013). cognitect.com
- ^ а б в "Clojure 1.11.0 release"
- ^ "Clojure: Clojure 1.0". clojure.blogspot.fi
- ^ "[ANN] dotLisp - a Lisp dialect for .
- ^ "jfli, a Java foreign language interface for Common Lisp".
- ^ "Foil - a Foreign Object Interface for Lisp".
- ^ "Lisplets - a Lisp-friendly interface to Java Servlets".
- ^ "JIRA workflow - Clojure Community - Clojure Development" Архивирано на сајту Wayback Machine (13. новембар 2015). dev.clojure.org
- ^ "Rationale".
- ^ Charles (2009-10-06).
- ^ "Economy Size Geek - Interview with Rich Hickey, Creator of Clojure | Linux Journal". www.linuxjournal.com
- ^ а б "On State and Identity".
- ^ "Clojure: Clojure is Two!"
- ^ а б в г д ђ Fingerhut, Andy.
- ^ "Clojure: Clojure 1.0".
- ^ "Clojure: Clojure 1.1 Release". clojure.blogspot.com
- ^ а б "Clojure - protocols". clojure.org
- ^ "clojure/clojure".
- ^ "Google Groups". groups.google.com
- ^ а б "Clojure - jvm_hosted". clojure.org
- ^ "Clojure - java_interop". clojure.org
- ^ а б contributors, Phil Hagelberg and.
- ^ "Clojure - reader". clojure.org
- ^ "Clojure - macros". clojure.org
- ^ "Clojure - datatypes". clojure.org
- ^ "Brian Goetz - Stewardship: the Sobering Parts".
- ^ "Clojure - special_forms". clojure.org
- ^ "Clojure - Refs". clojure.org
- ^ "Clojure - Agents". clojure.org
- ^ "Clojure - reader". clojure.org
- ^ "Transducers" by Rich Hickey. https://www.youtube.com/watch?v=6mTbuzafcII.
- ^ "Transducers are Coming"
- ^ "Rich Hickey - Inside Transducers".
- ^ "clojure/clojurescript".
- ^ "clojure/clojure-clr · GitHub".
- ^ Emerick, Chas.
- ^ "State of Clojure 2014 Results". cognitect.wufoo.com
- ^ Meier, Carin.
- ^ aemoncannon (2010-12-30).
- ^ "halgari/clojure-py · GitHub" Архивирано на сајту Wayback Machine (23. јануар 2016).
- ^ "rouge-lang/rouge · GitHub"[мртва веза].
- ^ "A lisp on Perl .
Литература
- Рочестер, Ерик (2015), Clojure Data Analysis Cookbook (Други изд.), Издање, ISBN 9781784390297
- Рочестер, Ерик (2014), Mastering Clojure Data Analysis (Први изд.), Издање, ISBN 9781783284139
- Фогус, Мајкл; Хаузер, Крис (2014), The Joy of Clojure (Други изд.), Манинг, ISBN 978-1-61729-141-8
- Фогус, Мајкл; Хаузер, Крис (2010), The Joy of Clojure (1st изд.), Манинг, ISBN 978-1-935182-64-1
- Халовеј, Стјуарт (2012), Програмирање Clojure (Други изд.), Pragmatic Bookshelf, ISBN 978-1-93435-686-9
- Редор, Ејмит (2011), Clojure у акцији (Први изд.), Манинг, ISBN 978-1-935182-59-7
- Вардер Харт, Лук; Сијера, Stuart (7. 6. 2010), Практични Clojure (Први изд.), Apress, ISBN 978-1-4302-7231-1
- Емерик, Час; Карпер, Брајан; Гранд, Кристофер (19. 4. 2012), Clojure програмирање (Први изд.), O'Reilly Media, ISBN 978-1-4493-9470-7
Спољашње везе
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png)
- Званични веб-сајт
- GitHub code repository for Clojure
- A comprehensive overview of Clojure Архивирано на сајту Wayback Machine (28. јун 2011)
- An overview of Clojure 1.2 in reference format Архивирано на сајту Wayback Machine (28. април 2017)
- Full Disclojure – Screencast
- Clojure talks on Youtube
- clojuredocs.org – Community-powered documentation and examples
- clojure-doc.org – Community-driven documentation site for the Clojure programming language
- 4clojure.com – Interactive Clojure Problems Архивирано на сајту Wayback Machine (24. април 2011)
- TryClojure – An online REPL for Clojure
- Clojure on infoq.com
- Clojure community and resources on Facebook
- R.Hickey presentation "Are We There Yet?" where he advocates for the reexamination of basic principles like state, identity, value, time, types, genericity, complexity, as they are used by OOP. 2009