Clojure
| Êëàññ ÿçûêà: | |
|---|---|
| Ïîÿâèëñÿ â: |
2007 |
| Àâòîð(û): | |
| Ðåëèç: | |
| Òèïèçàöèÿ äàííûõ: |
äèíàìè÷åñêàÿ, ñòðîãàÿ |
| Èñïûòàë âëèÿíèå: | |
| Ëèöåíçèÿ | |
| Ñàéò: | |
Clojure (ïðîèçíîñèòñÿ êàê closure) â ýòî ñîâðåìåííûé äèàëåêò Ëèñïà. Ýòî ÿçûê ïðîãðàììèðîâàíèÿ îáùåãî íàçíà÷åíèÿ ñ ïîääåðæêîé ðàçðàáîòêè â èíòåðàêòèâíîì ðåæèìå, ïîîùðÿþùèé ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå, è óïðîùàþùèé ïîääåðæêó ìíîãîïîòî÷íîñòè. Clojure ðàáîòàåò íà ïëàòôîðìàõ JVM è CLR. Clojure îòëè÷àåò ôèëîñîôèÿ «êîä êàê äàííûå (àíãë.)» è ðàçâèòàÿ ñèñòåìà ëèñï-ìàêðîñîâ.
Òðàíñëÿòîð Clojure ñâîáîäíî ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ Eclipse Public License.
Ñîäåðæàíèå |
[ïðàâèòü] Ôèëîñîôèÿ
Ðè÷ Õèêêè ðàçðàáîòàë Clojure êàê ñîâðåìåííûé Ëèñï äëÿ ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ ñ èíòåãðàöèåé â Java ïëàòôîðìó, ñïðîåêòèðîâàííûé äëÿ ïîääåðæêè êîíêóðåíòíûõ âû÷èñëåíèé.[3]
[ïðàâèòü] Ñèíòàêñèñ
Êàê è â ëþáîì äðóãîì Ëèñïå, ñèíòàêñèñ Clojure îñíîâàí íà S-âûðàæåíèÿõ, êîòîðûå ïåðåä êîìïèëÿöèåé òðàíñëèðóþòñÿ ñèíòàêñè÷åñêèì àíàëèçàòîðîì â ñòðóêòóðû äàííûõ. Ñèíòàêñè÷åñêèé àíàëèçàòîð Clojure ïîääåðæèâàåò, ïîìèìî îáû÷íûõ ñïèñêîâ, ñèíòàêñèñ ëèòåðàëîâ äëÿ àññîöèàòèâíûõ ìàññèâîâ, ìíîæåñòâ è âåêòîðîâ, ïåðåäàâàÿ çàòåì âñå ýòè ñòðóêòóðû äàííûõ êîìïèëÿòîðó. Èíà÷å ãîâîðÿ, êîìïèëÿòîð Clojure êîìïèëèðóåò íå òîëüêî ñïèñêîâûå ñòðóêòóðû äàííûõ, íî íàïðÿìóþ ïîääåðæèâàåò âñå óêàçàííûå òèïû. Clojure ÿâëÿåòñÿ ðàñøèðåíèåì èçíà÷àëüíîé âåðñèè Lisp, è íå ïðåäíàçíà÷åí äëÿ êîäà ñîâìåñòèìîãî ñ äðóãèìè äèàëåêòàìè Ëèñïà.
[ïðàâèòü] Ìàêðîñû
Ìàêðî ñèñòåìà Clojure î÷åíü ïîõîæà íà àíàëîãè÷íóþ ñèñòåìó Common Lisp, çà òåì èñêëþ÷åíèåì ÷òî èñïîëüçóåìûé â Clojure âàðèàíò îáðàòíîé êàâû÷êè (òàê íàçûâàåìûé «ñèíòàêñèñ öèòèðîâàíèÿ») êâàëèôèöèðóåò ñèìâîëû èõ èìåíåì. Ýòî ïîìîãàåò ïðåäîòâðàòèòü íåïðåäíàìåðåííûé çàõâàò èìåíè ïðè ïðèâÿçêå ê ïðîñòðàíñòâó èì¸í â êâàëèôèêàöèÿ èì¸í çàïðåùåíà. Ìîæíî âûïîëíèòü òàêîé çàõâàò ïðè ìàêðîïîäñòàíîâêå, íî ýòî äîëæíî áûòü ñäåëàíî ÿâíî. Clojure òàêæå çàïðåùàåò ñâÿçûâàíèå ãëîáàëüíûõ èì¸í èç äðóãèõ ïðîñòðàíñòâ èì¸í, êîòîðûå áûëè èìïîðòèðîâàíû â òåêóùåå ïðîñòðàíñòâå èì¸í.
[ïðàâèòü] Îñîáåííîñòè ÿçûêà
- Äèíàìè÷åñêàÿ, èíòåðàêòèâíàÿ ðàçðàáîòêà â REPL-öèêëå
- Ôóíêöèè êàê îáúåêòû ïåðâîãî êëàññà ñ àêöåíòîì íà ðåêóðñèþ, à íå íà îñíîâàííóþ íà ïîáî÷íûõ ýôôåêòàõ èòåðàöèþ
- «Ëåíèâûå» ïîñëåäîâàòåëüíîñòè
- Îáåñïå÷èâàåò áîãàòûé íàáîð íåèçìåíÿåìûõ, ñîõðàíÿåìûõ ñòðóêòóð äàííûõ (àíãë.)
- ïàðàëëåëüíîå ïðîãðàììèðîâàíèå ñ ïîääåðæêîé òðàíçàêöèîííîé ïàìÿòè, àãåíòíîé ñèñòåìû è ñèñòåìû äèíàìè÷åñêèõ ïåðåìåííûõ
- Clojure êîìïèëèðóåìûé ÿçûê, ðåçóëüòàòîì êîìïèëÿöèè ÿâëÿåòñÿ áàéòêîä JVM
- Òåñíàÿ èíòåãðàöèÿ ñ Java: çà ñ÷¸ò êîìïèëÿöèè â áàéòêîä JVM ïðîãðàììû íà Clojure ëåãêî ïåðåíîñÿòñÿ â ëþáóþ ñðåäó ñ JVM. ßçûê òàêæå îáåñïå÷èâàåò ðÿä ìàêðîñîâ, êîòîðûå óïðîùàþò èñïîëüçîâàíèå â í¸ì ñóùåñòâóþùèõ Java API. Ñòðóêòóðû äàííûõ Clojure ðåàëèçóþò âñå ñòàíäàðòíûå èíòåðôåéñû Java, ÷òî äåëàåò ëåãêèì çàïóñê èç Java ïðîãðàììíîãî êîäà íàïèñàííîãî íà Clojure.
[ïðàâèòü] Ïðèìåðû
(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
[ïðàâèòü] Ïðèìå÷àíèÿ
- â‘ Clojure 1.4!, Alex Ott
- â‘ Rich Hickey Books that influenced Clojure (30 June 2009). Àðõèâèðîâàíî èç ïåðâîèñòî÷íèêà 18 àïðåëÿ 2012. Ïðîâåðåíî 11 ñåíòÿáðÿ 2009.
- â‘ Rationale. Rich Hickey. clojure.org. Àðõèâèðîâàíî èç ïåðâîèñòî÷íèêà 18 àïðåëÿ 2012. Ïðîâåðåíî 17 îêòÿáðÿ 2008.
[ïðàâèòü] Áèáëèîãðàôèÿ
- Halloway, Stuart (May 28, 2009), Programming Clojure (1st ed.), Pragmatic Bookshelf, pp. 304, ISBN 1934356336, <http://pragprog.com/titles/shcloj/programming-clojure>
- VanderHart, Luke (June 7, 2010), Practical Clojure (1st ed.), Apress, pp. 350, ISBN 1430272317, <http://www.apress.com/book/view/9781430272311>
- Rathore, Amit (Early 2011), Clojure in Action (1st ed.), Manning, pp. 475, ISBN 9781935182597, <http://www.manning.com/rathore/>
- Fogus, Michael & Houser, Chris (December, 2010), The Joy of Clojure (1st ed.), Manning, pp. 300, ISBN 9781935182641, <http://www.manning.com/fogus/>
[ïðàâèòü] Ññûëêè
- îôèöèàëüíûé ñàéò Clojure (àíãë.)
- ðåïîçèòîðèé êîäà Clojure íà GitHub (àíãë.)
- Clojure â Functional Programming for the JVM (àíãë.) â ïîäðîáíûé îáçîð ÿçûêà
- Full Disclojure â Âèäåîäåìîíñòðàöèÿ (àíãë.)
[ïðàâèòü] Íà ðóññêîì ÿçûêå
- ßçûê ïðîãðàììèðîâàíèÿ Clojure â Ââåäåíèå íà IBM developerWorks
- Àëåêñ Îòò. Clojure, èëè «Âû âñå åù¸ èñïîëüçóåòå Java? Òîãäà ìû èäåì ê âàì!» â 4 âûïóñêå æóðíàëà «Ïðàêòèêà ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ» (Îáíîâëåííàÿ âåðñèÿ ñòàòüè, ñ îïèñàíèåì âåðñèè 1.2)
- Ôîðóì î Clojure íà lisper.ru
â ñîîáùåñòâî «Clojure» â Æèâîì Æóðíàëå- Ðóññêàÿ ïëàíåòà Clojure â àããðåãàòîð ðóññêîÿçû÷íûõ áëîãîâ î Clojure
| Îñíîâíûå ÿçûêè ïðîãðàììèðîâàíèÿ (ñðàâíåíèå IDE èñòîðèÿ õðîíîëîãèÿ) | |
|---|---|
| Èñïîëüçóåìûå â ðàçðàáîòêå |
Àäà APL ßçûê àññåìáëåðà ActionScript ABAP/4 AutoIt AWK Áåéñèê Ñè Êîáîë C++ C# Cω Clarion Clojure ColdFusion Common Lisp D dBase Delphi Eiffel Erlang Euphoria F# Ôîðò Ôîðòðàí Gambas Go Groovy HAL/S Haskell Icon Java JavaScript Limbo Lua Object Pascal Objective-C OCaml Oz Parser Ïàñêàëü Perl PHP PowerBASIC PureBasic Python ÏË/1 Ïðîëîã Ruby Scala Scheme Smalltalk SQL PL/SQL Tcl Vala Visual Basic (.NET) |
| Àêàäåìè÷åñêèå | |
| IEC 61131-3 | |
| Ïðî÷èå | |
| Ýçîòåðè÷åñêèå | |
| Âèçóàëüíûå | |