Clojure (изговор: кложур, као енгл. closure - "затварање"[3]) је дијалект Lisp програмског језика који је створио Рич Хиклеј .[4] Clojure је програмски језик опште намене са нагласком на фунционалном програмирању.[5] То ради на Јава виртуелној машиниЦЛР,[6] и ЈаваСкрипт машинама. Као и други Lisp-ови, Clojure се третира као код података и има макро систем.[7] Садашњи процес развоја заједнице,[8] је надгледао Рич Хиклеј као њен БДФЛ.

Clojure
Clojure
Парадигмафункционална
Првобитни
програмер(и)
Рич Хиклеј
Прва верзија2007;пре 8 година
Најновија
верзија
1.11.1[1]
Дисциплина куцањадинамична, снажна
ПлатформаЈВМ, ЦЛР, Јаваскрипт
ЛиценцаЈавна Еклипс лиценца
Екстензије.clj, .cljs, .cljc, .edn
Веб-сајтclojure.org
Под утицајем
Common Lisp, Erlang, Haskell, ML, Prolog, Scheme, Java, Ruby[2]
Утицао на
Elixir, Pixie, Rhine

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 јер је желео модеран 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. ^ „Кложур издање 1.11.1”. 22. 3. 2022. Приступљено 17. 11. 2022. 
  2. ^ „Clojure Programming” (PDF). Приступљено 2013-04-30. 
  3. ^ "meaning and pronunciation of Clojure".
  4. ^ а б "Clojure inventor Hickey now aims for Android".
  5. ^ а б "Clojure - home". clojure.org
  6. ^ "clojure/clojure-clr".
  7. ^ "Clojure - lisp". clojure.org
  8. ^ а б в "Contributing FAQ - Clojure Community - Clojure Development" Архивирано на сајту Wayback Machine (20. новембар 2015). dev.clojure.org
  9. ^ "clojure/core.typed".
  10. ^ а б "Clojure - state". clojure.org
  11. ^ "Walmart Runs Clojure at Scale"
  12. ^ "A New Era of Application Services at Puppet Labs" Архивирано на сајту Wayback Machine (25. октобар 2015).
  13. ^ "Clojure Programming Language :: Cognitect, Clojure Consulting, Clojure Support, Functional Programming, JVM" Архивирано на сајту Wayback Machine (19. септембар 2013). cognitect.com
  14. ^ а б в "Clojure 1.11.0 release"
  15. ^ "Clojure: Clojure 1.0". clojure.blogspot.fi
  16. ^ "[ANN] dotLisp - a Lisp dialect for .
  17. ^ "jfli, a Java foreign language interface for Common Lisp".
  18. ^ "Foil - a Foreign Object Interface for Lisp".
  19. ^ "Lisplets - a Lisp-friendly interface to Java Servlets".
  20. ^ "JIRA workflow - Clojure Community - Clojure Development" Архивирано на сајту Wayback Machine (13. новембар 2015). dev.clojure.org
  21. ^ "Rationale".
  22. ^ Charles (2009-10-06).
  23. ^ "Economy Size Geek - Interview with Rich Hickey, Creator of Clojure | Linux Journal". www.linuxjournal.com
  24. ^ а б "On State and Identity".
  25. ^ "Clojure: Clojure is Two!"
  26. ^ а б в г д ђ Fingerhut, Andy.
  27. ^ "Clojure: Clojure 1.0".
  28. ^ "Clojure: Clojure 1.1 Release". clojure.blogspot.com
  29. ^ а б "Clojure - protocols". clojure.org
  30. ^ "clojure/clojure".
  31. ^ "Google Groups". groups.google.com
  32. ^ а б "Clojure - jvm_hosted". clojure.org
  33. ^ "Clojure - java_interop". clojure.org
  34. ^ а б contributors, Phil Hagelberg and.
  35. ^ "Clojure - reader". clojure.org
  36. ^ "Clojure - macros". clojure.org
  37. ^ "Clojure - datatypes". clojure.org
  38. ^ "Brian Goetz - Stewardship: the Sobering Parts".
  39. ^ "Clojure - special_forms". clojure.org
  40. ^ "Clojure - Refs". clojure.org
  41. ^ "Clojure - Agents". clojure.org
  42. ^ "Clojure - reader". clojure.org
  43. ^ "Transducers" by Rich Hickey. https://www.youtube.com/watch?v=6mTbuzafcII.
  44. ^ "Transducers are Coming"
  45. ^ "Rich Hickey - Inside Transducers".
  46. ^ "clojure/clojurescript".
  47. ^ "clojure/clojure-clr · GitHub".
  48. ^ Emerick, Chas.
  49. ^ "State of Clojure 2014 Results". cognitect.wufoo.com
  50. ^ Meier, Carin.
  51. ^ aemoncannon (2010-12-30).
  52. ^ "halgari/clojure-py · GitHub" Архивирано на сајту Wayback Machine (23. јануар 2016).
  53. ^ "rouge-lang/rouge · GitHub"[мртва веза].
  54. ^ "A lisp on Perl .

Литература уреди

Спољашње везе уреди