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šiniCLR,[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
Clojure
Paradigmafunkcionalna
Prvobitni
programer(i)
Rič Hiklej
Prva verzija2007;pre 8 godina
Najnovija
verzija
1.11.1[1]
Disciplina kucanjadinamična, snažna
PlatformaJVM, CLR, Javaskript
LicencaJavna Eklips licenca
Ekstenzije.clj, .cljs, .cljc, .edn
Veb-sajtclojure.org
Pod uticajem
Common Lisp, Erlang, Haskell, ML, Prolog, Scheme, Java, Ruby[2]
Uticao na
Elixir, Pixie, Rhine

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

 
Rič Hiklej u San Francisku

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

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

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

[30]

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 objekterid-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

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

Zdravo svete:

(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

Reference uredi

  1. ^ „Kložur izdanje 1.11.1”. 22. 3. 2022. Pristupljeno 17. 11. 2022. 
  2. ^ „Clojure Programming” (PDF). Pristupljeno 2013-04-30. 
  3. ^ "meaning and pronunciation of Clojure".
  4. ^ a b "Clojure inventor Hickey now aims for Android".
  5. ^ a b "Clojure - home". clojure.org
  6. ^ "clojure/clojure-clr".
  7. ^ "Clojure - lisp". clojure.org
  8. ^ a b v "Contributing FAQ - Clojure Community - Clojure Development" Arhivirano na sajtu Wayback Machine (20. novembar 2015). dev.clojure.org
  9. ^ "clojure/core.typed".
  10. ^ a b "Clojure - state". clojure.org
  11. ^ "Walmart Runs Clojure at Scale"
  12. ^ "A New Era of Application Services at Puppet Labs" Arhivirano na sajtu Wayback Machine (25. oktobar 2015).
  13. ^ "Clojure Programming Language :: Cognitect, Clojure Consulting, Clojure Support, Functional Programming, JVM" Arhivirano na sajtu Wayback Machine (19. septembar 2013). cognitect.com
  14. ^ a b v "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" Arhivirano na sajtu Wayback Machine (13. novembar 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. ^ a b "On State and Identity".
  25. ^ "Clojure: Clojure is Two!"
  26. ^ a b v g d đ Fingerhut, Andy.
  27. ^ "Clojure: Clojure 1.0".
  28. ^ "Clojure: Clojure 1.1 Release". clojure.blogspot.com
  29. ^ a b "Clojure - protocols". clojure.org
  30. ^ "clojure/clojure".
  31. ^ "Google Groups". groups.google.com
  32. ^ a b "Clojure - jvm_hosted". clojure.org
  33. ^ "Clojure - java_interop". clojure.org
  34. ^ a b 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" Arhivirano na sajtu Wayback Machine (23. januar 2016).
  53. ^ "rouge-lang/rouge · GitHub"[mrtva veza].
  54. ^ "A lisp on Perl .

Literatura uredi

Spoljašnje veze uredi