乳头为什么会内陷
Paradigma | funkcionální, multiparadigmovy |
---|---|
Vznik | 2007 |
Vyvojá? | Rich Hickey |
První vydání | 2007 |
Poslední verze | 1.9.0 (8. prosince 2017[1]) |
Typová kontrola | dynamické, silné |
Ovlivněn jazyky | Lisp, ML, Haskell, Erlang[2] |
Ovlivnil jazyky | Elixir, Hy, Pixie, Rhine |
OS | Multiplatformní |
Licence | Eclipse Public License |
Web | clojure.org |
Clojure (vyslovnost [?klou???r]) je v informatice moderní dialekt programovacího jazyka Lisp. Jedná se o univerzální jazyk podporující funkcionální programování, ktery se zamě?uje na zjednodu?ení vyvoje vícevláknovych aplikací. Clojure pou?ívá běhové prost?edí JVM nebo CLR, p?i?em? zastává filozofii kódu, ktery se chová jako data a implementuje sofistikovany Lispovy makrosystém.
Filozofie
[editovat | editovat zdroj]Rich Hickey vyvinul Clojure, proto?e si p?ál moderní Lisp spolupracující s roz?í?enou platformou Java, ktery by byl navr?en pro vyvoj vícevláknovych aplikací.[3][4]
Clojure pou?ívá pro ?ízení soubě?nosti koncept tzv. identit,[5] ktery si lze p?edstavit jako sérii v ?ase neměnitelnych stav?. Jeliko? tyto stavy mají neměnitelné hodnoty, m??e nad nimi paralelně operovat jakykoliv po?et vláken a ?ízení soubě?nosti se stává otázkou spravování p?echod? z jednoho stavu do dal?ího. Pro tento ú?el Clojure poskytuje 4 měnitelné referen?ní typy, kde ka?dy má jasně definovanou sémantiku pro p?echod mezi stavy.
Syntaxe
[editovat | editovat zdroj]Jako ka?dy Lisp, syntaxe jazyka Clojure je postavena na s-vyrazech, které jsou nejprve rozebrány do datovych struktur p?ed tím ne? jsou zkompilovány. Clojure podporuje literály pro struktury jako seznamy, mapy, mno?iny a pole, které jsou kompilátoru p?edány tak jak jsou. Clojure je Lisp-1 a není zamy?leno, aby byl kompatibilní s ostatními dialekty Lispu.
Makra
[editovat | editovat zdroj]Makro je konstrukce, které v argumentech p?edáme S-vyrazy, ze kterych je následně sestaven libovolny kód. Poté se tento kód vykoná. Systém maker v Clojuru je velice podobny kódu Common Lispu.
Vlastnosti jazyka
[editovat | editovat zdroj]- dynamicky vyvoj pomocí REPL
- funkce jsou first-class objekty s d?razem na rekurzi namísto smy?ek vytvá?ejících postranní efekty
- líně vyhodnocované sekvence
- poskytuje bohatou sadu neměnitelnych datovych struktur
- soubě?né programování pomocí softwarové transak?ní paměti, agentovy systém a dynamicky typovy systém
- multimetody poskytují dynamické spu?tění metod, jejich? konkrétní implementace je vybrána na základě typu p?edanych parametr?
- jazyk je kompilovany do JVM bajtkódu
- silná integrace s Javou: kód jazyka Clojure kompilovany do JVM bajtkódu m??e byt snadno nasazeny do bě?ného prost?edí JVM a aplika?ních server? bez dal?ích potí?í; jazyk dále poskytuje makra, která usnadňují pou?ití existujících Java API; jeho struktury implementují standardní rozhraní Javy, co? umo?ňuje spou?tět kód napsany v Clojure z Javy
P?íklady
[editovat | editovat zdroj]Ahoj světe
[editovat | editovat zdroj](println "Ahoj světe!")
GUI verze
[editovat | editovat zdroj](javax.swing.JOptionPane/showMessageDialog nil "Ahoj světe")
Vláknově bezpe?ny generátor unikátních sériovych ?ísel
[editovat | editovat zdroj](let [i (atom 0)]
(defn generate-unique-id
"Vrací r?zná ?íselná ID pro ka?dé volání."
[]
(swap! i inc)))
Anonymní podt?ída java.io.Writer
[editovat | editovat zdroj]Tato t?ída nikam nezapisuje a obsahuje makro, které uml?í v?echno vypisování.
(def bit-bucket-writer
(proxy [java.io.Writer] []
(write [buf] nil)
(close [] nil)
(flush [] nil)))
(defmacro noprint
"Vykoná p?edané vyrazy a uml?í v?echna vypisování na *out* (standardní vystup)."
[& forms]
`(binding [*out* bit-bucket-writer]
~@forms))
(noprint
(println "Zdravím nikoho!"))
Vlákna
[editovat | editovat zdroj]Následující p?íklad ukazuje 10 vláken operujících nad spole?nou datovou strukturou, která se skládá ze 100 vektor?, ka?dy obsahující 10 (zpo?átku po sobě jdoucích) unikátních ?ísel. Ka?dé vlákno vybírá 2 náhodné pozice ve 2 náhodnych vektorech a prohazuje je. V?echny změny ve vektorech probíhají v transakcích s pou?itím softwarové transak?ní paměti, a proto ani po 100 000 iteracích ka?dého vlákna se neztratí ?ádné ?íslo.
(defn run [nvecs nitems nthreads niters]
(let [vec-refs (vec (map (comp ref vec)
(partition nitems (range (* nvecs nitems)))))
swap #(let [v1 (rand-int nvecs)
v2 (rand-int nvecs)
i1 (rand-int nitems)
i2 (rand-int nitems)]
(dosync
(let [temp (nth @(vec-refs v1) i1)]
(alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
(alter (vec-refs v2) assoc i2 temp))))
report #(do
(prn (map deref vec-refs))
(println "Distinct:"
(count (distinct (apply concat (map deref vec-refs))))))]
(report)
(dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
(report)))
(run 100 10 10 100000)
Vystup
[editovat | editovat zdroj]([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
Reference
[editovat | editovat zdroj]- ↑ Central Repository: org/clojure/clojure/1.9.0 [online]. Rev. 2025-08-05 [cit. 2025-08-05]. Dostupné online. (anglicky)[nedostupny zdroj]
- ↑ HICKEY, Rich. Books that influenced Clojure [online]. 2025-08-05 [cit. 2025-08-05]. Dostupné online. (anglicky)
- ↑ Clojure - Rationale [online]. Rich Hickey, 2025-08-05 [cit. 2025-08-05]. Dostupné online. (anglicky)
- ↑ Charles. Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure [online]. Microsoft, 2025-08-05 [cit. 2025-08-05]. (Channel 9. Going Deep). Dostupné online. (anglicky)
- ↑ Clojure - Values and Change: Clojure‘s approach to Identity and State [online]. Rich Hickey, 2025-08-05 [cit. 2025-08-05]. Dostupné online. (anglicky)
Literatura
[editovat | editovat zdroj]- HALLOWAY, Stuart. Programming Clojure. 1. vyd. [s.l.]: Pragmatic Bookshelf, May 28, 2009. Dostupné online. ISBN 1934356336. S. 304.
- VANDERHART, Luke. Practical Clojure. 1. vyd. [s.l.]: Apress, 31. prosince 2009. Dostupné online. ISBN 1430272317. S. 350.
- RATHORE, Amit. Clojure in Action. 1. vyd. [s.l.]: Manning, prosinec 2009. Dostupné online. ISBN 9781935182597. S. 475.
- FOGUS, Michael; HOUSER, Chris. The Joy of Clojure. 1. vyd. [s.l.]: Manning, leden 2010. Dostupné online. ISBN 9781935182641. S. 300.
Externí odkazy
[editovat | editovat zdroj]Obrázky, zvuky ?i videa k tématu Clojure na Wikimedia Commons
- (anglicky) GitHub repozitá? pro Clojure
- (anglicky) Velká recenze Clojure
- (anglicky) Full Disclojure – Screencast