Clojure
![]() Clojure | |
Paradigma | funkcionalna |
---|---|
Prvobitni programer(i) | Rič Hiklej |
Prva verzija | 2007;pre 8 godina |
Najnovija verzija | 1.11.1[1] |
Disciplina kucanja | dinamična, snažna |
Platforma | JVM, CLR, Javaskript |
Licenca | Javna Eklips licenca |
Ekstenzije | .clj, .cljs, .cljc, .edn |
Veb-sajt | clojure |
Pod uticajem | |
Common Lisp, Erlang, Haskell, ML, Prolog, Scheme, Java, Ruby[2] | |
Uticao na | |
Elixir, Pixie, Rhine |
Clojure (izgovor: kložur, kao engl. closure - "zatvaranje"[3]) je dijalekt Lisp programskog jezika koji je stvorio Rič Hiklej .[4] Clojure je programski jezik opšte namene sa naglaskom na funcionalnom programiranju.[5] To radi na Java virtuelnoj mašini, CLR,[6] i JavaSkript mašinama. Kao i drugi Lisp-ovi, Clojure se tretira kao kod podataka i ima makro sistem.[7] Sadašnji proces razvoja zajednice,[8] je nadgledao Rič Hiklej kao njen BDFL.
Clojure uzima moderan stav o programiranju nepromenljivosti i nepromenljivoj strukturi podataka. Dok je tipski sistem u potpunosti dinamičan, nedavni napori takođe traže sprovođenje postupnog kucanja. [9] Clojure ohrabruje programere da budu eksplicitni oko upravljanja glavnine i identiteta. .[10] Ovaj fokus na programiranje sa nepromenljivim vrednostima i eksplicitna progresija njenog radnog vremena konstruktima daje za cilj olakšavanje razvoja jačih programa, naročito onih višenitnih.
Clojure se uspešno koristi u industrijama kompanija kao što su Volmart [11] Papet Labs,[12] i drugih velikih softverskih kompanija.[13] Godišnja Clojure konferencija se organizuje jednom godišnje širom sveta, najpoznatiji od njih je Clojure/conj (istočno američka obala), Clojure/West (zapadno američka obala), i EuroClojure (Evropa).
Najnovija stabilna verzija Clojure je 1.11.1,[14] objavljena 11. marta 2022. godine. Prvo stabilno izdanje je verzija 1.0, objavljena 4. maja 2009. godine.[15] Clojure je slobodni softver objavnjen pod Eklips javnom licencom.
Istorija i razvoj procesa
[uredi | uredi izvor]
Rič Hiklej je osnivač Clojure progamskog jezika.[4] Pre Clojure, razvio je dotLisp, projekat baziran na . NET platformi.[16] Takođe je razvio jfli[17] (Java strani jezik interfejs za Common Lisp), FOIL[18] (strano telo interfejsa za Lisp) i Lisp-ets[19] (Lisp-prijateljski interfejs za Java Servlets). To troje su raniji pokušaji da se obezbede interoperabilnosti između Lisp-a i Jave.
Hiklej je proveo oko 2 ½ godine radeći na Clojure pre nego što ga je javno pustio, veliki deo tog vremena radio je isključivo na Clojure bez spoljnog finansiranja. Na kraju ovog perioda Hiklej je poslao mejl nekim prijateljima u kom najavljuje jezik u Common Lisp zajednici.
Proces razvoja je zajednica[8] kojom se upravlja na sajtu Clojure zajednice. Sajt sadrži planske dokumentacije i problem tragač gde može da otkloni kvarove. Diskusija opšteg razvoja se odvija na Clojure Dev Gugl grupa. Iako svako može da podnese izveštaje o greškama i idejama, izmene mora potpisati kontributor Clojure,[8] JIRA karte se obrađuju od strane tima i konačno Rič Hiklej odobrava promene.[20]
Filozofija dizajna
[uredi | uredi izvor]Rič Hiklej je razvio Clojure jer je želeo moderan Lisp za funkcionalno programiranje, simbiozu sa utvrđenom Java platformom, a dizajniran za konkurenciju.[21][22][23]
Clojure pristup do stanja karakteriše kocept identiteta,[24] koji su predstavljen kao niz nepromenljivih stanja tokom vremena. Od stanja su imutabilne vrednosti, bilo koji broj radnika mogu da rade na njima paralelno, a konkurencija postaje pitanje upravljanja promenama iz jednog stanja u drugo. U tu svrhu,Clojure obezbeđuje nekoliko promenljivih referentnih tipova, od kojih svaka ima dobro definisane semantike za tranziciju između stanja.[10][24]
Karakteristike
[uredi | uredi izvor]Verzija | Datum izlaska | Dodate glavne karakteristike |
---|---|---|
2007-10-16[25] | inicijalna javna izdanja | |
1.0 | 2009-05-04[26] | prva stabilna izdanjas[27] |
1.1 | 2009-12-31[26] | Budućis[28] |
1.2 | 2010-08-19[26] | Protokolis[29] |
1.3 | 2011-09-23[26] | Enhejnsed primitivna podrška |
1.4 | 2012-04-15[26] | Čitači literali |
1.5 | 2013-03-01[26] | Reduktori |
1.6 | 2014-03-25[31] | Java API, poboljšani keširani algoritmi |
2015-06-30[14] | Pretvarači, čitači kondicionali | |
buduća izdanja |
Clojure radi na Java virtualnoj mašini i kao rezultat integriše sa Java i u potpunosti podržava poziv Java koda sa Clojure,[32] i Clojure kod može biti pozvan iz Jave.[33] Zajednica koristi Leiningen[34] za automatizaciju projekta , pružanje podrške za Maven integraciju. Leiningen se bavi upravljanjem projekata paketa i zavisnosti i konfiguriše Clojure sintaksu.[34]
Kao i većina drugih Lisp-ova, Clojure sintaksa je izgrađena na C-izrazima koji su prvo obrađeni u strukture podataka od strane čitaoca pre nego što je sastavio.[35] Clojure čitalac podržava doslovno sintaksu za heš tabele, skupove i vektore pored lista, a to su sastavili do pomenutih struktura direktno. Clojure je Lisp 1 i nije namenjen da bude kod kompatibilan sa drugim dijalektima Lisp-a, jer koristi sopstveni skup struktura podataka koje nisu kompatibilne sa drugim Lisp.
Kao Lisp dijalekat, Clojure podržava potprobleme kao prvoklasne objekte, rid-ivil-print petlje, i makro sistem.[36] Makro sistem Clojure je veoma sličan onom u Komon Lipsu sa izuzetkom Clojure verzije bekcitat (zvani "citat sintakse")kvalifikuje simbole sa svojim imenskim prostorom. Ovo pomaže u sprečavanju nenamenjom imenu snimanja, kao obavezujuće za imenski prostor-kvalifikovana imena su zabranjena. Moguće je da prisiliti snimanju makro ekspanziju, ali to mora biti urađeno eksplicitno. Clojure ne dozvoljava da korisnik definiše čitač makroa, ali čitalac podržava više ograničen oblik sintaktičkog produžetka. Clojure podržava multimetodu i interfejs poput apstrakcije protokolal[29] baziran na polimorfizmu i tipu sistema podataka korišćenjem rekordsa,[37] i obezbeđuje visoke performanse i dinamičan polimorfizam dizajniran da se izbegne problem izraza.
Clojure ima podršku za lenje sekvence i podstiče princip nepromenljivosti i upornih struktura podataka. Kao funkcionalnom jeziku, akcenat je stavnjen na rekurziju i viši red funkcije umesto sporednog efekta baze petlje. Automatska repna rekurzija nije podržana kao JVM ne podržava prirodno [38] pa je moguće da se to uradi eksplicitno pomoću ponavljanja rekur ključne reči.[39] Za paralelnu obradu i paralelno izračunavanje Clojure obezbeđuje softver transakciju memorije [40] reaktivan dodatak sistema,[41] and kanal zasnovan na istovremenom programiranju.
Nedavno Clojure je uveo čitača uređaja dozvoljavajući ugradnju Clojure and ClojureScript koda u istom prostoru imena. [14][42] Senzori su dodati kao način za sastavljanje transformacija. Senzori omogućavaju višeg reda funkcije kao što su karte i preklapaju generetor preko bilo kakvog izvor ulaznih podataka, kako tradicionalno ove funkcije rade na sekvenci, pretvarači im omogućavaju da rade na kanalima i puste korisnika da definiše svoje modele za transdukciju.[43][44][45]
Platforme i popularnost
[uredi | uredi izvor]Primarna platforma Clojure je JVM,[5][32] ali postoje i druge ciljne implementacije. Najznačajniji od njih su ClojureScript,[46] koji se nastavlja na JavaSkript, i ClojureCLR,[47] potpuni priključak na Komon Rantajm jeziku, interoperabilni sa . NET ekosistemima. Istraživanje na Clojure zajednici nad 1600 ispitanika sprovedeno u 2013. godini[48] pokazalo je da 47% ispitanika koristi oba Clojure i ClojureScript dok radi sa Clojure. 2014. godine taj broj se povećao na 55%.[49] Popularni ClojureScript projekti uključuju implementacije Reakt biblioteke kao Reagent i Om.
Clojure se koristi za kreativno računarstvo, uključujući virtuelnu umetnost, muziku, igre i poeziju.[50]
Varijacije Clojure jezika su razvijene za platforme osim:
- las3r,[51] podskup Clojure koji radi na AkšnSkript virtuelnoj mašini (Adob Fleš Plejer platforma)
- clojure-py,[52] implementacija Clojure u čistom Pajtonu
- ruž,[53] implementacija Clojure na vrhu JARV u Rubiju
- CljPerl,[54] implementacija Clojure na vrhu Perla.
Primeri
[uredi | uredi izvor](println "Hello world!")
Definisanje funkcije:
(defn square [x]
(* x x))
GUI "Zdravo svete" pozivom Java Sving biblioteke :
(javax.swing.JOptionPane/showMessageDialog nil "Hello World" )
Koristeći jedinstven kod (Zdravo 世 ("svete") koristeći CJK kod tačku za tu reč):
(println (str "Hello, " \u4e16)) ; to the console
(javax.swing.JOptionPane/showMessageDialog nil (str "Hello, " \u4e16 "!")); using Java GUI
Bezbedno-nitni generator jedinstvenih serijskih brojeva (mada kao i u mnogim drugim Lisp dijalektima, Clojure ima ugrađenu генсим
funkciju da interno koristi):
(let [i (atom 0)]
(defn generate-unique-id
"Returns a distinct numeric ID for each call."
[]
(swap! i inc)))
Anonimna klasa [1]јава.ио
[2]вритер
da ne piše ni na šta, a makro se koristi da ućutka sve otiske u njima:
(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 tema manipuliše jednom zajedničkom strukturom podataka, koji se sastoji od 100 vektora a svaki od ljih sadrži 10(u početku uzastopne) jedinstvene brojeve. Svaka nit onda iznova bira dve slučajne pozicije u dva slučajna vektora i menja ih. Sve promene vektora javljaju u transakcijama koristeći Clojure softversku transakcionu memoriju sistema.
(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)
Izlaz iz prethodnog primera:
([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
Vidi još
[uredi | uredi izvor]Reference
[uredi | uredi izvor]- ^ „Kložur izdanje 1.11.1”. 22. 3. 2022. Pristupljeno 17. 11. 2022.
- ^ „Clojure Programming” (PDF). Pristupljeno 2013-04-30.
- ^ "meaning and pronunciation of Clojure".
- ^ a b "Clojure inventor Hickey now aims for Android".
- ^ a b "Clojure - home". clojure.org
- ^ "clojure/clojure-clr".
- ^ "Clojure - lisp". clojure.org
- ^ a b v "Contributing FAQ - Clojure Community - Clojure Development" Arhivirano na veb-sajtu Wayback Machine (20. novembar 2015). dev.clojure.org
- ^ "clojure/core.typed".
- ^ a b "Clojure - state". clojure.org
- ^ "Walmart Runs Clojure at Scale"
- ^ "A New Era of Application Services at Puppet Labs" Arhivirano na veb-sajtu Wayback Machine (25. oktobar 2015).
- ^ "Clojure Programming Language :: Cognitect, Clojure Consulting, Clojure Support, Functional Programming, JVM" Arhivirano na veb-sajtu Wayback Machine (19. septembar 2013). cognitect.com
- ^ a b v "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" Arhivirano na veb-sajtu Wayback Machine (13. novembar 2015). dev.clojure.org
- ^ "Rationale".
- ^ Charles (2009-10-06).
- ^ "Economy Size Geek - Interview with Rich Hickey, Creator of Clojure | Linux Journal". www.linuxjournal.com
- ^ a b "On State and Identity".
- ^ "Clojure: Clojure is Two!"
- ^ a b v g d đ Fingerhut, Andy.
- ^ "Clojure: Clojure 1.0".
- ^ "Clojure: Clojure 1.1 Release". clojure.blogspot.com
- ^ a b "Clojure - protocols". clojure.org
- ^ "clojure/clojure".
- ^ "Google Groups". groups.google.com
- ^ a b "Clojure - jvm_hosted". clojure.org
- ^ "Clojure - java_interop". clojure.org
- ^ a b 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" Arhivirano na veb-sajtu Wayback Machine (23. januar 2016).
- ^ "rouge-lang/rouge · GitHub"[mrtva veza].
- ^ "A lisp on Perl .
Literatura
[uredi | uredi izvor]- Ročester, Erik (2015), Clojure Data Analysis Cookbook (Drugi izd.), Izdanje, ISBN 9781784390297, Arhivirano iz originala 05. 11. 2018. g., Pristupljeno 13. 11. 2015
- Ročester, Erik (2014), Mastering Clojure Data Analysis (Prvi izd.), Izdanje, ISBN 9781783284139, Arhivirano iz originala 05. 11. 2018. g., Pristupljeno 13. 11. 2015
- Fogus, Majkl; Hauzer, Kris (2014), The Joy of Clojure (Drugi izd.), Maning, ISBN 978-1-61729-141-8
- Fogus, Majkl; Hauzer, Kris (2010), The Joy of Clojure (1st izd.), Maning, ISBN 978-1-935182-64-1
- Halovej, Stjuart (2012), Programiranje Clojure (Drugi izd.), Pragmatic Bookshelf, ISBN 978-1-93435-686-9
- Redor, Ejmit (2011), Clojure u akciji (Prvi izd.), Maning, ISBN 978-1-935182-59-7
- Varder Hart, Luk; Sijera, Stuart (7. 6. 2010), Praktični Clojure (Prvi izd.), Apress, ISBN 978-1-4302-7231-1
- Emerik, Čas; Karper, Brajan; Grand, Kristofer (19. 4. 2012), Clojure programiranje (Prvi izd.), O'Reilly Media, ISBN 978-1-4493-9470-7
Spoljašnje veze
[uredi | uredi izvor]- Zvanični veb-sajt
- GitHub code repository for Clojure
- A comprehensive overview of Clojure Arhivirano na veb-sajtu Wayback Machine (28. jun 2011)
- An overview of Clojure 1.2 in reference format Arhivirano na veb-sajtu Wayback Machine (28. april 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 Arhivirano na veb-sajtu Wayback Machine (24. april 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