Clojure

Поделись знанием:
Перейти к: навигация, поиск
Clojure
Класс языка:

функциональный, мультипарадигмальный

Появился в:

2007

Автор:

Рич Хикки

Система типов:

динамическая, строгая

Испытал влияние:

Lisp, ML, Haskell, Erlang[1], Prolog, Scheme, Java, Ruby[2]

Повлиял на:

Elixir

Лицензия:

Eclipse Public License

Сайт:

[clojure.org .org]

Clojure (произносится как closure [ˈklōZHər]) — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме, поощряющий функциональное программирование и упрощающий поддержку многопоточности. Clojure работает на платформах JVM и CLR. Clojure отличает философия «код как данные» (англ. homoiconicity) и развитая система лисп-макросов.

Транслятор 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.sun.com/javase/6/docs/api/java/io/Writer.html 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. Rich Hickey. [www.amazon.com/gp/richpub/listmania/fullview/R3LG3ZBZS4GCTH Books that influenced Clojure] (30 June 2009). Проверено 11 сентября 2009. [www.webcitation.org/670lU1kCX Архивировано из первоисточника 18 апреля 2012].
  2. [cdn.oreilly.com/oreilly/booksamplers/9781449394707_sampler.pdf Clojure Programming]. Проверено 30 апреля 2013.
  3. [clojure.org/rationale Rationale]. Rich Hickey. clojure.org. Проверено 17 октября 2008. [www.webcitation.org/670lV6rpJ Архивировано из первоисточника 18 апреля 2012].

Библиография

  • Halloway, Stuart (May 28, 2009), [pragprog.com/titles/shcloj/programming-clojure Programming Clojure] (1st ed.), Pragmatic Bookshelf, сс. 304, ISBN 1934356336, <pragprog.com/titles/shcloj/programming-clojure> 
  • VanderHart, Luke (June 7, 2010), [www.apress.com/book/view/9781430272311 Practical Clojure] (1st ed.), Apress, сс. 350, ISBN 1430272317, <www.apress.com/book/view/9781430272311> 
  • Rathore, Amit (Early 2011), [www.manning.com/rathore/ Clojure in Action] (1st ed.), Manning, сс. 475, ISBN 9781935182597, <www.manning.com/rathore/> 
  • Fogus, Michael & Houser, Chris (December, 2010), [www.manning.com/fogus/ The Joy of Clojure] (1st ed.), Manning, сс. 300, ISBN 9781935182641, <www.manning.com/fogus/> 

Ссылки

  • [clojure.org официальный сайт Clojure]  (англ.)
  • [github.com/clojure/clojure/ репозиторий кода Clojure] на GitHub (англ.)
  • [java.ociweb.com/mark/clojure/article.html Clojure — Functional Programming for the JVM] (англ.) — подробный обзор языка
  • [vimeo.com/channels/fulldisclojure Full Disclojure — Видеодемонстрация] (англ.)

На русском языке

  • [www.ibm.com/developerworks/ru/library/os-eclipse-clojure/index.html Язык программирования Clojure] — Введение на [www.ibm.com/developerworks/ru/ IBM developerWorks]
  • [fprog.ru/2010/issue4/alex-ott-clojure/ Алекс Отт. Clojure, или «Вы все ещё используете Java? Тогда мы идем к вам!»] в [fprog.ru/2010/issue4/ 4 выпуске] журнала [fprog.ru/ «Практика функционального программирования»] ([alexott.net/ru/clojure/clojure-intro/ Обновленная версия статьи], с описанием версии 1.2)
  • [lisper.ru/forum/clojure Форум о Clojure] на [lisper.ru/ lisper.ru]
  • [ru_clojure.livejournal.com/ ru_clojure] — сообщество «Clojure» в «Живом Журнале»
  • [feeds.feedburner.com/RussianClojurePlanet Русская планета Clojure] — аггрегатор русскоязычных блогов о Clojure

Отрывок, характеризующий Clojure

Увидав графа, она протянула к нему руки, обняла его лысую голову и через лысую голову опять посмотрела на письмо и портрет и опять для того, чтобы прижать их к губам, слегка оттолкнула лысую голову. Вера, Наташа, Соня и Петя вошли в комнату, и началось чтение. В письме был кратко описан поход и два сражения, в которых участвовал Николушка, производство в офицеры и сказано, что он целует руки maman и papa, прося их благословения, и целует Веру, Наташу, Петю. Кроме того он кланяется m r Шелингу, и m mе Шос и няне, и, кроме того, просит поцеловать дорогую Соню, которую он всё так же любит и о которой всё так же вспоминает. Услыхав это, Соня покраснела так, что слезы выступили ей на глаза. И, не в силах выдержать обратившиеся на нее взгляды, она побежала в залу, разбежалась, закружилась и, раздув баллоном платье свое, раскрасневшаяся и улыбающаяся, села на пол. Графиня плакала.
– О чем же вы плачете, maman? – сказала Вера. – По всему, что он пишет, надо радоваться, а не плакать.
Это было совершенно справедливо, но и граф, и графиня, и Наташа – все с упреком посмотрели на нее. «И в кого она такая вышла!» подумала графиня.
Письмо Николушки было прочитано сотни раз, и те, которые считались достойными его слушать, должны были приходить к графине, которая не выпускала его из рук. Приходили гувернеры, няни, Митенька, некоторые знакомые, и графиня перечитывала письмо всякий раз с новым наслаждением и всякий раз открывала по этому письму новые добродетели в своем Николушке. Как странно, необычайно, радостно ей было, что сын ее – тот сын, который чуть заметно крошечными членами шевелился в ней самой 20 лет тому назад, тот сын, за которого она ссорилась с баловником графом, тот сын, который выучился говорить прежде: «груша», а потом «баба», что этот сын теперь там, в чужой земле, в чужой среде, мужественный воин, один, без помощи и руководства, делает там какое то свое мужское дело. Весь всемирный вековой опыт, указывающий на то, что дети незаметным путем от колыбели делаются мужами, не существовал для графини. Возмужание ее сына в каждой поре возмужания было для нее так же необычайно, как бы и не было никогда миллионов миллионов людей, точно так же возмужавших. Как не верилось 20 лет тому назад, чтобы то маленькое существо, которое жило где то там у ней под сердцем, закричало бы и стало сосать грудь и стало бы говорить, так и теперь не верилось ей, что это же существо могло быть тем сильным, храбрым мужчиной, образцом сыновей и людей, которым он был теперь, судя по этому письму.
– Что за штиль, как он описывает мило! – говорила она, читая описательную часть письма. – И что за душа! Об себе ничего… ничего! О каком то Денисове, а сам, верно, храбрее их всех. Ничего не пишет о своих страданиях. Что за сердце! Как я узнаю его! И как вспомнил всех! Никого не забыл. Я всегда, всегда говорила, еще когда он вот какой был, я всегда говорила…
Более недели готовились, писались брульоны и переписывались набело письма к Николушке от всего дома; под наблюдением графини и заботливостью графа собирались нужные вещицы и деньги для обмундирования и обзаведения вновь произведенного офицера. Анна Михайловна, практическая женщина, сумела устроить себе и своему сыну протекцию в армии даже и для переписки. Она имела случай посылать свои письма к великому князю Константину Павловичу, который командовал гвардией. Ростовы предполагали, что русская гвардия за границей , есть совершенно определительный адрес, и что ежели письмо дойдет до великого князя, командовавшего гвардией, то нет причины, чтобы оно не дошло до Павлоградского полка, который должен быть там же поблизости; и потому решено было отослать письма и деньги через курьера великого князя к Борису, и Борис уже должен был доставить их к Николушке. Письма были от старого графа, от графини, от Пети, от Веры, от Наташи, от Сони и, наконец, 6 000 денег на обмундировку и различные вещи, которые граф посылал сыну.


12 го ноября кутузовская боевая армия, стоявшая лагерем около Ольмюца, готовилась к следующему дню на смотр двух императоров – русского и австрийского. Гвардия, только что подошедшая из России, ночевала в 15 ти верстах от Ольмюца и на другой день прямо на смотр, к 10 ти часам утра, вступала на ольмюцкое поле.
Николай Ростов в этот день получил от Бориса записку, извещавшую его, что Измайловский полк ночует в 15 ти верстах не доходя Ольмюца, и что он ждет его, чтобы передать письмо и деньги. Деньги были особенно нужны Ростову теперь, когда, вернувшись из похода, войска остановились под Ольмюцом, и хорошо снабженные маркитанты и австрийские жиды, предлагая всякого рода соблазны, наполняли лагерь. У павлоградцев шли пиры за пирами, празднования полученных за поход наград и поездки в Ольмюц к вновь прибывшей туда Каролине Венгерке, открывшей там трактир с женской прислугой. Ростов недавно отпраздновал свое вышедшее производство в корнеты, купил Бедуина, лошадь Денисова, и был кругом должен товарищам и маркитантам. Получив записку Бориса, Ростов с товарищем поехал до Ольмюца, там пообедал, выпил бутылку вина и один поехал в гвардейский лагерь отыскивать своего товарища детства. Ростов еще не успел обмундироваться. На нем была затасканная юнкерская куртка с солдатским крестом, такие же, подбитые затертой кожей, рейтузы и офицерская с темляком сабля; лошадь, на которой он ехал, была донская, купленная походом у казака; гусарская измятая шапочка была ухарски надета назад и набок. Подъезжая к лагерю Измайловского полка, он думал о том, как он поразит Бориса и всех его товарищей гвардейцев своим обстреленным боевым гусарским видом.
Гвардия весь поход прошла, как на гуляньи, щеголяя своей чистотой и дисциплиной. Переходы были малые, ранцы везли на подводах, офицерам австрийское начальство готовило на всех переходах прекрасные обеды. Полки вступали и выступали из городов с музыкой, и весь поход (чем гордились гвардейцы), по приказанию великого князя, люди шли в ногу, а офицеры пешком на своих местах. Борис всё время похода шел и стоял с Бергом, теперь уже ротным командиром. Берг, во время похода получив роту, успел своей исполнительностью и аккуратностью заслужить доверие начальства и устроил весьма выгодно свои экономические дела; Борис во время похода сделал много знакомств с людьми, которые могли быть ему полезными, и через рекомендательное письмо, привезенное им от Пьера, познакомился с князем Андреем Болконским, через которого он надеялся получить место в штабе главнокомандующего. Берг и Борис, чисто и аккуратно одетые, отдохнув после последнего дневного перехода, сидели в чистой отведенной им квартире перед круглым столом и играли в шахматы. Берг держал между колен курящуюся трубочку. Борис, с свойственной ему аккуратностью, белыми тонкими руками пирамидкой уставлял шашки, ожидая хода Берга, и глядел на лицо своего партнера, видимо думая об игре, как он и всегда думал только о том, чем он был занят.
– Ну ка, как вы из этого выйдете? – сказал он.
– Будем стараться, – отвечал Берг, дотрогиваясь до пешки и опять опуская руку.