ñòàòüèGNU Free Documentation License ìàòåðèàëû âçÿòû èç Âèêèïåäèè Ñòàòüÿ áûëà èçìåíåíà. Îðèãèíàë ñòàòüè.

Clojure

Ìàòåðèàë èç Ýíöèêëîïåäèè â ñâîáîäíîé ýíöèêëîïåäèè
Ïåðåéòè ê: íàâèãàöèÿ, ïîèñê
Clojure
Clojure-glyph.svg
Êëàññ ÿçûêà:

ôóíêöèîíàëüíûé, ìóëüòèïàðàäèãìàëüíûé

Ïîÿâèëñÿ â:

2007

Àâòîð(û):

Ðè÷ Õèêêè

Ðåëèç:

1.4[1] (15 àïðåëÿ 2012)

Òèïèçàöèÿ äàííûõ:

äèíàìè÷åñêàÿ, ñòðîãàÿ

Èñïûòàë âëèÿíèå:

Lisp, ML, Haskell, Erlang[2]

Ëèöåíçèÿ

Eclipse Public License

Ñàéò:

http://clojure.org

Clojure (ïðîèçíîñèòñÿ êàê closure) â ýòî ñîâðåìåííûé äèàëåêò Ëèñïà. Ýòî ÿçûê ïðîãðàììèðîâàíèÿ îáùåãî íàçíà÷åíèÿ ñ ïîääåðæêîé ðàçðàáîòêè â èíòåðàêòèâíîì ðåæèìå, ïîîùðÿþùèé ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå, è óïðîùàþùèé ïîääåðæêó ìíîãîïîòî÷íîñòè. Clojure ðàáîòàåò íà ïëàòôîðìàõ JVM è CLR. Clojure îòëè÷àåò ôèëîñîôèÿ «êîä êàê äàííûå (àíãë.)» è ðàçâèòàÿ ñèñòåìà ëèñï-ìàêðîñîâ.

Òðàíñëÿòîð Clojure ñâîáîäíî ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ Eclipse Public License.

Ñîäåðæàíèå

[ïðàâèòü] Ôèëîñîôèÿ

Ðè÷ Õèêêè ðàçðàáîòàë Clojure êàê ñîâðåìåííûé Ëèñï äëÿ ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ ñ èíòåãðàöèåé â Java ïëàòôîðìó, ñïðîåêòèðîâàííûé äëÿ ïîääåðæêè êîíêóðåíòíûõ âû÷èñëåíèé.[3]

[ïðàâèòü] Ñèíòàêñèñ

Êàê è â ëþáîì äðóãîì Ëèñïå, ñèíòàêñèñ Clojure îñíîâàí íà S-âûðàæåíèÿõ, êîòîðûå ïåðåä êîìïèëÿöèåé òðàíñëèðóþòñÿ ñèíòàêñè÷åñêèì àíàëèçàòîðîì â ñòðóêòóðû äàííûõ. Ñèíòàêñè÷åñêèé àíàëèçàòîð Clojure ïîääåðæèâàåò, ïîìèìî îáû÷íûõ ñïèñêîâ, ñèíòàêñèñ ëèòåðàëîâ äëÿ àññîöèàòèâíûõ ìàññèâîâ, ìíîæåñòâ è âåêòîðîâ, ïåðåäàâàÿ çàòåì âñå ýòè ñòðóêòóðû äàííûõ êîìïèëÿòîðó. Èíà÷å ãîâîðÿ, êîìïèëÿòîð Clojure êîìïèëèðóåò íå òîëüêî ñïèñêîâûå ñòðóêòóðû äàííûõ, íî íàïðÿìóþ ïîääåðæèâàåò âñå óêàçàííûå òèïû. Clojure ÿâëÿåòñÿ ðàñøèðåíèåì èçíà÷àëüíîé âåðñèè Lisp, è íå ïðåäíàçíà÷åí äëÿ êîäà ñîâìåñòèìîãî ñ äðóãèìè äèàëåêòàìè Ëèñïà.

[ïðàâèòü] Ìàêðîñû

Ìàêðî ñèñòåìà Clojure î÷åíü ïîõîæà íà àíàëîãè÷íóþ ñèñòåìó Common Lisp, çà òåì èñêëþ÷åíèåì ÷òî èñïîëüçóåìûé â Clojure âàðèàíò îáðàòíîé êàâû÷êè (òàê íàçûâàåìûé «ñèíòàêñèñ öèòèðîâàíèÿ») êâàëèôèöèðóåò ñèìâîëû èõ èìåíåì. Ýòî ïîìîãàåò ïðåäîòâðàòèòü íåïðåäíàìåðåííûé çàõâàò èìåíè ïðè ïðèâÿçêå ê ïðîñòðàíñòâó èì¸í â êâàëèôèêàöèÿ èì¸í çàïðåùåíà. Ìîæíî âûïîëíèòü òàêîé çàõâàò ïðè ìàêðîïîäñòàíîâêå, íî ýòî äîëæíî áûòü ñäåëàíî ÿâíî. Clojure òàêæå çàïðåùàåò ñâÿçûâàíèå ãëîáàëüíûõ èì¸í èç äðóãèõ ïðîñòðàíñòâ èì¸í, êîòîðûå áûëè èìïîðòèðîâàíû â òåêóùåå ïðîñòðàíñòâå èì¸í.

[ïðàâèòü] Îñîáåííîñòè ÿçûêà

[ïðàâèòü] Ïðèìåðû

Hello world:

(println "Çäðàâñòâóé, ìèð!")

Ïîòîêîáåçîïàñíûé ãåíåðàòîð óíèêàëüíûõ ñåðèéíûõ íîìåðîâ:

(let [i (atom 0)]
  (defn generate-unique-id
    "Âîçâðàùàåò ðàçëè÷íûå ÷èñëîâûå ID äëÿ êàæäîãî âûçîâà."
    []
    (swap! i inc)))

Àíîíèìíûé ïîäêëàññ java.io.Writer êîòîðûé íè÷åãî íå âûâîäèò, è ìàêðîñ èñïîëüçóåìûé, ÷òîáû çàãëóøèòü âåñü âûâîä âíóòðè íåãî:

(def bit-bucket-writer
  (proxy [java.io.Writer] []
    (write [buf] nil)
    (close []    nil)
    (flush []    nil)))
 
(defmacro noprint
  "Âû÷èñëÿåò çàäàííûå âûðàæåíèÿ, çàãëóøàÿ âåñü *âûâîä* íà ýêðàí".
  [& forms]
  `(binding [*out* bit-bucket-writer]
     ~@forms))
 
(noprint
 (println "Hello, nobody!"))

10 ïîòîêîâ, ìàíèïóëèðóþùèõ îäíîé îáùåé ñòðóêòóðîé äàííûõ, êîòîðàÿ ñîñòîèò èç 100 âåêòîðîâ, êàæäûé èç êîòîðûõ ñîäåðæèò 10 (èçíà÷àëüíî ïîñëåäîâàòåëüíûõ) óíèêàëüíûõ ÷èñåë. Êàæäûé ïîòîê ìíîãîêðàòíî âûáèðàåò äâå ñëó÷àéíûõ ïîçèöèè â äâóõ ñëó÷àéíûõ âåêòîðàõ è îáìåíèâàåò ìåñòàìè èõ çíà÷åíèÿ. Âñå èçìåíåíèÿ âåêòîðîâ ïðîèñõîäÿò â åäèíîé òðàíçàêöèè ïóòåì èñïîëüçîâàíèÿ ñèñòåìû òðàíçàêöèîííîé ïàìÿòè clojure. Ïîýòîìó äàæå ïîñëå 1000 èòåðàöèé â êàæäîì èç ïîòîêîâ ÷èñëà íå òåðÿþòñÿ.

(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)

Âûâîä ïðåäûäóùåãî ïðèìåðà:

([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. â‘ Clojure 1.4!, Alex Ott
  2. â‘ Rich Hickey Books that influenced Clojure (30 June 2009). Àðõèâèðîâàíî èç ïåðâîèñòî÷íèêà 18 àïðåëÿ 2012. Ïðîâåðåíî 11 ñåíòÿáðÿ 2009.
  3. â‘ Rationale. Rich Hickey. clojure.org. Àðõèâèðîâàíî èç ïåðâîèñòî÷íèêà 18 àïðåëÿ 2012. Ïðîâåðåíî 17 îêòÿáðÿ 2008.

[ïðàâèòü] Áèáëèîãðàôèÿ

[ïðàâèòü] Ññûëêè

[ïðàâèòü] Íà ðóññêîì ÿçûêå

Ïðîñòðàíñòâà èì¸í

Âàðèàíòû
Ïðîñìîòðû
Äåéñòâèÿ