Clojure — разлика између измена

С Википедије, слободне енциклопедије
Садржај обрисан Садржај додат
Autobot (разговор | доприноси)
м Разне исправке
Ред 158: Ред 158:


== Додатна литература ==
== Додатна литература ==
{{Refbegin}}
* {{citation
| first1 = Ерик
| last1 = Рочестер
| year = 2015
| title = Clojure Data Analysis Cookbook
| publisher = Издање
| edition = Други
| isbn = 9781784390297
| url = https://www.packtpub.com/application-development/clojure-data-analysis-cookbook-second-edition
}}
* {{citation
| first1 = Ерик
| last1 = Рочестер
| year = 2014
| title = Mastering Clojure Data Analysis
| publisher = Издање
| edition = Први
| isbn = 9781783284139
| url = https://www.packtpub.com/big-data-and-business-intelligence/mastering-clojure-data-analysis
}}
* {{citation
| first1 = Мајкл
| last1 = Фогус
| first2 = Крис
| last2 = Хаузер
| year = 2014
| title = The Joy of Clojure
| publisher = Манинг
| edition = Други
| isbn = 1-617291-41-2
}}
* {{citation
| first1 = Мајкл
| last1 = Фогус
| first2 = Крис
| last2 = Хаузер
| year = 2010
| title = The Joy of Clojure
| publisher = Манинг
| edition = 1st
| isbn = 1-935182-64-1
}}
* {{citation
| first1 = Стјуарт
| last1 = Халовеј
| year = 2012
| title = Програмирање Clojure
| publisher = [[Pragmatic Bookshelf]]
| edition = Други
| isbn = 978-1-93435-686-9
}}
* {{citation
| first1 = Ејмит
| last1 = Редор
| year = 2011
| title = Clojure у акцији
| publisher = Манинг
| edition = Први
| isbn = 1-935182-59-5
| url =
}}
* {{citation
| first1 = Лук
| last1 = Вардер Харт
| first2 = Stuart
| last2 = Сијера
| date = Јун 7, 2010
| title = Практични Clojure
| publisher = [[Apress]]
| edition = Први
| isbn = 1-4302-7231-7
}}
* {{citation
| first1 = Час
| last1 = Емерик
| first2 = Брајан
| last2 = Карпер
| first3 = Кристофер
| last3 = Гранд
| date = Април 19, 2012
| title = Clojure програмирање
| publisher = [[O'Reilly Media]]
| edition = Први
| isbn = 1-4493-9470-1
}}
{{Refend}}


== Спољашње везе ==
== Спољашње везе ==

Верзија на датум 13. новембар 2015. у 20:05

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

Clojure узима модеран став о програмирању као непроменљивости и непроменљивој структури података. Док је типски систем у потпуности динамичан, недавни напори такође траже спровођење поступног куцања[7] Clojure охрабрује програмере да буду експлицитни око управљања главнине и идентитета. .[8] Овај фокус на програмирање са непроменљивим вредностима и експлицитна прогресија њеног радног времена конструктима даје за циљ да олакшају развој јачих програма, нарочито оних вишенитних.

 Clojure се успешно користи у индустријама компанија као што су Волмарт [9] Папет Лабс,[10]  и других великих софтверских компанија.[11]  Годишња Clojure конференција се организује једном годишње широм света, најпознатији од њих је Clojure/conj (источно америчка обала), Clojure/West (западно америчка обала), и EuroClojure (Европа).

Најновија стабилна верзија Clojure је 1.7,[12] објављена 30. јуна 2015.године. Прво стабилно издање је верзија 1.0, објављена 4.маја 2009.године.[13] Clojure је слободни софтвер објавњен под Еклипс јавном лиценцом.

Историја и развој процеса

Рич Хиклеј у Сан Франциску

Рич Хиклеј је оснивач Clojure прогамског језика.[2] Пре Clojure, развио је дотЛисп, пројекат базиран на .НЕТ платформи.[14] Такође је развио јфли[15] (Јава страних језика интерфејс за Комон Лисп), ФОИЛ[16] (страно тело интерфејса за Лисп) и Лиспетс[17] (Лисп-пријатељски интерфејс за Јава Сервлетс). То троје су ранији покушаји да се обезбеде интероперабилности између Лиспа и Јаве.

Хиклеј је провео око 2 ½ године радећи на Clojure пре него што га је јавно пустио, велики део тог времена радио је искључиво на Clojure без спољног финансирања. На крају овог периода Хиклеј је послао мејл неким пријатељима у ком најављује језик у Комон Лисп заједници.

Процес развоја је заједница[6] којом се управља на сајту Clojure заједнице. Сајт садржи планске документације и проблем трагач где може да отклони кварове. Дискусија општег развоја се одвија на Clojure Дев Гугл група. Иако свако може да поднесе извештаје о грешкама и идејама, измене мора потписати контрибутор Clojure,[18] JИРА карте се обрађују од стране тима и коначно Рич Хиклеј одобрава промене.[19]

Филозофија дизајна

Рич Хиклеј је развио Clojure јер је желео модеран Лисп за функционално програмирање, симбиозу са утврђеном Јава платформом, а дизајниран за конкуренцију.[20][21][22]

Clojure приступ до стања карактерише коцепт идентитета,[23] који су представљен као низ непроменљивих стања током времена.Од стања су имутабилне вредности, било који број радника могу да раде на њима паралелно, а конкуренција постаје питање управљања променама из једног стања у друго. У ту сврху,Clojure обезбеђује неколико променљивих референтних типова, од којих свака има добро дефинисане семантике за транзицију између стања.[8][23]

Карактеристике

Верзија Датум изласка Додате главне карактеристике
2007-10-16[24] иницијална јавна издања
1.0 2009-05-04[25] прва стабилна издањаs[26]
1.1 2009-12-31[25] Будућиs[27]
1.2 2010-08-19[25] Протоколиs[28]
1.3 2011-09-23[25] Енхејнсед примитивна подршка

[29]

1.4 2012-04-15[25] Читачи литерали
1.5 2013-03-01[25] Редуктори
1.6 2014-03-25[30] Јава АПИ, побољшани кеширани алгоритми
2015-06-30[12] Претварачи, читачи кондиционали
будућа издања

Clojure ради на Јава виртуалној машини и као резултат интегрише са Јава и у потпуности подржава позив Јава кода са Clojure,[31] и Clojure код може бити позван из Јаве.[32] Заједница користи Леининген[33] за аутоматизацију пројекта , пружање подршке за Мавен интеграцију. Леининген се бави управљањем пројеката пакета и зависности и конфигурише Clojure синтаксу.[33]

Као и већина других Лиспова, Clojure синтакса је изграђена на Ц-изразима који су прво обрађени у структуре података од стране читаоца пре него што је саставио.[34] Clojure читалац подржава дословно синтаксу за мапе, скупове и векторе поред листа, а то су саставили до поменутих структура директно. Clojure  је Лисп 1 и није намењен да буде код компатибилан са другим дијалектима Лисп, јер користи сопствени скуп структура података које нису компатибилна са другим Лисповима.

 Као Лисп дијалекат, Clojure подржава функције као првокласне објекрид-ивил-принт петље, и макро систем.[35] Макро систем Clojure је веома сличан оном у Комон Липсу са изузетком Clojure верзије бекцитат (звани "цитат синтаксе")квалификује симболе са својим именским простором. Ово помаже у спречавању ненамењом имену снимања, као обавезујуће за именски простор-квалификована имена су забрањена. Могуће је да присилити снимању макро експанзију, али то мора бити урађено експлицитно. Цлојуре не дозвољава да корисник дефинише читач макроа, али читалац подржава више ограничен облик синтактичког продужетка. Clojure подржава мултиметоду и интерфејс попут апстракције протоколаl[28] базиран на полиморфизму и типу система података коришћењем рекордса,[36]  и обезбеђује високе перформансе и динамичан полиморфизам дизајниран да се избегне проблем израза.

Clojure има подршку за лење секвенце и подстиче принцип непроменљивости и упорних структура података. Као функционалном језику, акценат је ставњен на рекурзију и виши ред функције уместо споредног ефекта базе петље. Аутоматски реп позива оптимизације није подржан као ЈВМ не подржава природно [37] па је могуће да се то уради експлицитно помоћу понављања рекур кључне речи.[38] За паралелно и истовремено програмирање Clojure обезбеђује софтвер трансакцију меморије [39] реактиван додатак система,[40] and канал заснован на истовременом програмирању.

Недавно Clojure је увео читача уређаја дозвољавајући уградњу Clojure and ClojureScript кода у истом простору имена. [12][41] Сензори су додати као начин за састављање трансформација. Сензори омогућавају вишег реда функције као што су карте и преклапају генеретор преко било каквог извор улазних података, како традиционално ове функције раде на секвенци, претварачи им омогућавају да раде на каналима и пусте корисника да дефинише своје моделе за трансдукцију.[42][43][44]

Платформе и популарност

Примарна платформа Clojure је ЈВМ,[3][31] али постоје и друге циљне имплементације. Најзначајнији од њих су ClojureScript,[45] који се наставља на ЈаваСкрипт, и ClojureCLR,[46] потпуни прикључак на Комон Рантајм језику, интероперабилни са .НЕТ екосистемима. Истраживање на Clojure заједници над 1600 испитаника спроведено у 2013. години[47] показало је да 47% испитаника користи оба Clojure и ClojureScript док ради са Clojure. 2014.године тај број се повећао на 55%.[48] Популарни ClojureScript пројекти укључују имплементације Реакт библиотеке као Реагент и Ом.

Clojure се користи за креативно рачунарство, укључујући виртуелну уметност, музику, игре и поезију.[49]

Варијације Clojure језика су развијене за платформе осим:

  • лас3р,[50] подскуп Clojure који ради на АкшнСкрипт виртуелној машини (Адоб Флеш Плејер платформа)
  • clojure-py,[51] имплементација Clojure у чистом Пајтону
  • руж,[52] имплементација Clojure на врху ЈАРВ у Рубију
  • ЦљПерл,[53] имплементација 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

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

Додатна литература

Спољашње везе