Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Clojure ( / к л oʊ ʒ ər / , как и закрытие ) [15] [16] является динамическим и функциональными говор на языке программирования Lisp на Java платформе. [17] [18] Как и другие диалекты Лиспа, Clojure обрабатывает код как данные и имеет макросистему Лиспа . [19] В настоящее время процесса развития сообщества управляемого общества , [20] под контролем Рича Хикки , как егодоброжелательный пожизненный диктатор (БДФЛ). [21]

Clojure защищает неизменность и неизменяемые структуры данных и призывает программистов четко описывать управление идентификацией и ее состояниями. [22] Этот акцент на программировании с неизменяемыми значениями и явными конструкциями прогрессии времени предназначен для облегчения разработки более надежных, особенно параллельных , программ, простых и быстрых. [23] [24] [15] Хотя его система типов полностью динамична , недавние усилия также были направлены на реализацию постепенной типизации . [25]

Коммерческая поддержка Clojure предоставляется Cognitect. [26] Конференции Clojure организуются каждый год по всему миру, самая известная из них - Clojure / con. [27]

История и процесс развития [ править ]

Рич Хики, создатель Clojure

Рич Хики - создатель языка Clojure. [17] До Clojure он разработал dotLisp, аналогичный проект, основанный на платформе .NET , [28] и три предыдущих попытки обеспечить взаимодействие между Lisp и Java : интерфейс иностранного языка Java для Common Lisp (jfli), [29] Незнакомый объект интерфейса для Лиспа (ФОЛЬГА), [30] и Лисп-интерфейс для Java - приложений (Lisplets). [31]

Хики потратил около 2,5 лет на работу над Clojure, прежде чем опубликовать его, большую часть этого времени работал исключительно над Clojure без внешнего финансирования. По истечении этого времени Хики отправил электронное письмо с описанием языка некоторым друзьям из сообщества Common Lisp.

Процесс разработки управляется сообществом [20] и управляется на странице проекта Clojure JIRA . [32] Общее обсуждение разработки происходит в Clojure Google Group. [33] Любой может отправлять вопросы и идеи на ask.clojure.org, [34] но чтобы вносить исправления, нужно подписать соглашение Clojure Contributor. [35] Проблемы JIRA обрабатываются командой проверяющих, и, наконец, Рич Хики утверждает изменения. [36]

Имя Clojure, по словам Хики, представляет собой каламбур на концепции программирования « закрытие », включающий буквы C, L и J для C # , Lisp и Java соответственно - трех языков, которые оказали большое влияние на дизайн Clojure. [16]

Философия дизайна [ править ]

Рич Хики разработал Clojure, потому что ему нужен современный Лисп для функционального программирования , симбиотический с установленной платформой Java и предназначенный для параллелизма . [23] [24] [37] [15]

Подход Clojure к состоянию характеризуется концепцией идентичностей [22], которые представлены в виде серии неизменяемых состояний во времени. Поскольку состояния являются неизменяемыми значениями, любое количество рабочих процессов может работать с ними параллельно, и параллелизм становится вопросом управления изменениями из одного состояния в другое. Для этой цели Clojure предоставляет несколько изменяемых ссылочных типов , каждый из которых имеет четко определенную семантику для перехода между состояниями. [22]

Обзор языка [ править ]

Clojure работает на платформе Java и, как результат, интегрируется с Java и полностью поддерживает вызов кода Java из Clojure, [53] [15] и код Clojure также может быть вызван из Java. [54] Сообщество использует Leiningen для автоматизации проектов, обеспечивая поддержку интеграции Maven . Leiningen обрабатывает управление пакетами проекта и зависимости и настраивается с использованием синтаксиса Clojure. [55]

Как и большинство других Лиспов, синтаксис Clojure построен на S-выражениях , которые сначала анализируются в структуры данных читателем перед компиляцией. [56] [15] Читатель Clojure поддерживает буквальный синтаксис для карт , множеств и векторов в дополнение к спискам, и они компилируются непосредственно в упомянутые структуры. [56] Clojure является Lisp-1 и не предназначен для кодовой совместимости с другими диалектами Lisp, поскольку он использует свой собственный набор структур данных, несовместимых с другими Lisp. [19]

Как диалект Лиспа, Clojure поддерживает функции как объекты первого класса , цикл чтения-оценки-печати (REPL) и макросистему. [6] Макросистема Lisp в Clojure очень похожа на систему макросов Common Lisp за исключением того, что версия обратной кавычки в Clojure (называемая «синтаксической кавычкой») квалифицирует символы с их пространством имен . Это помогает предотвратить непреднамеренный захват имен, поскольку привязка к именам, определенным пространством имен, запрещена. Можно принудительно развернуть захват макроса, но это должно быть сделано явно. Clojure не позволяет создавать макросы для чтения, определяемые пользователем, но программа для чтения поддерживает более ограниченную форму синтаксического расширения. [57]Clojure опора мультиметоды [58] , а также для интерфейса -подобных абстракций имеет протокол [59] на основе полиморфизма и типа данных с помощью системы записи , [60] обеспечивает высокую производительность и динамический полиморфизм , предназначенный , чтобы избежать проблем экспрессии .

Clojure поддерживает ленивые последовательности и поощряет принцип неизменности и постоянных структур данных . В качестве функционального языка упор делается на рекурсию и функции высшего порядка, а не на циклы, основанные на побочных эффектах. Автоматическая оптимизация хвостового вызова не поддерживается, поскольку JVM не поддерживает ее изначально; [61] [62] [63] это можно сделать явно с помощью recurключевого слова. [64] Для параллельного и параллельного программирования Clojure предоставляет программную транзакционную память ,[65] система реактивного агента , [1] ипараллельное программирование на основе каналов . [66]

Clojure 1.7 представил условия для чтения, разрешив встраивание кода Clojure и ClojureScript в одно и то же пространство имен. [47] [56] Преобразователи были добавлены как метод для создания преобразований. Преобразователи позволяют выполнять функции более высокого порядка, такие как отображение и сворачивание, для обобщения по любому источнику входных данных. Хотя традиционно эти функции работают с последовательностями , преобразователи позволяют им работать с каналами и позволяют пользователю определять свои собственные модели для преобразования. [67] [68] [69]

Альтернативные платформы [ править ]

Основная платформа Clojure является Java , [18] [53] существуют , но и другие целевые реализации. Наиболее заметными из них являются ClojureScript [70], который компилируется в ECMAScript 3, [71] и ClojureCLR [72], полный порт на платформе .NET , совместимый с его экосистемой. Опрос сообщества Clojure с участием 1060 респондентов, проведенный в 2013 году [73], показал, что 47% респондентов использовали Clojure и ClojureScript при работе с Clojure. В 2014 году это число увеличилось до 55% [74], в 2015 году, исходя из 2445 респондентов, до 66%. [75]Популярные проекты ClojureScript включают реализации библиотеки React, такие как Reagent, [76] re-frame, [77] Rum, [78] и Om. [79] [80]

Другие реализации [ править ]

Другие реализации Clojure на разных платформах включают:

  • CljPerl, [81] Clojure поверх Perl
  • Clojerl, [82] Clojure на BEAM , виртуальной машине Erlang.
  • clojure-py, [83] Clojure на чистом Python
  • Ferret, [84] компилируется в автономный C ++ 11, который может работать на микроконтроллерах.
  • Джокер, [85] интерпретатор и линтер, написанный на Go
  • Las3r, [86] подмножество Clojure, которое работает на виртуальной машине ActionScript (платформа Adobe Flash Player).
  • Пикси, [87] Диалект Лиспа, вдохновленный Clojure, написанный на RPython.
  • Rouge, [88] Clojure поверх YARV на Ruby.

Популярность [ править ]

Благодаря постоянному интересу к функциональному программированию, применение Clojure разработчиками программного обеспечения, использующими платформу Java, продолжало расти. Этот язык также был рекомендован разработчиками программного обеспечения, такими как Брайан Гетц, [89] [90] [91] Эрик Эванс, [92] [93] Джеймс Гослинг , [94] Пол Грэм , [95] и Роберт К. Мартин . [96] [97] [98] [99] ThoughtWorks , оценивая функциональные языки программирования для своего радара технологий, [100]описал Clojure как «простую и элегантную реализацию Lisp на JVM» в 2010 году и повысил его статус до «ADOPT» в 2012 году. [101]

В «Отчете об экосистеме JVM за 2018 год» (который был объявлен «крупнейшим опросом разработчиков Java за всю историю»), который был подготовлен в сотрудничестве Snyk и Java Magazine, Clojure занял второе место среди наиболее часто используемых языков программирования на JVM для » основные приложения ». [102] Clojure используется в промышленности такими фирмами [103] , как Apple , [104] [105] Atlassian , [106] Funding Circle , [107] Netflix , [108] Puppet , [109] и Walmart [110] как а также правительственные агентства, такие как НАСА . [111]Он также использовался для творческих вычислений, включая изобразительное искусство, музыку, игры и поэзию. [112]

Инструменты [ править ]

Инструменты для разработки Clojure за прошедшие годы значительно улучшились. Ниже приведен список некоторых популярных IDE и текстовых редакторов с плагинами, которые добавляют поддержку программирования на Clojure: [113]

  • Атом с хлором [114]
  • Emacs с CIDER [115]
  • IntelliJ IDEA с Clojure-Kit [116] или Cursive [117] (доступна бесплатная лицензия для некоммерческого использования)
  • Световой стол
  • Vim , с камином.vim, [118] [119] vim-iced, [120] или Conjure (только для Neovim) [121] [122]
  • Код Visual Studio с Calva [123] или Clover [124]

В дополнение к инструментам, предоставляемым сообществом, официальные инструменты CLI Clojure [125] также стали доступны для GNU / Linux , macOS и Windows, начиная с Clojure 1.9. [126]

Особенности на примере [ править ]

Следующие ниже примеры могут быть запущены в Clojure REPL, например, с помощью инструментов CLI Clojure [125], или в интерактивном REPL, например, доступном на REPL.it. [127]

Простота [ править ]

Из-за сильного упора на простоту типичные программы Clojure состоят в основном из функций и простых структур данных (то есть списков, векторов, карт и наборов):

;; Типичная точка входа в программу Clojure: ;; `-main` функция ( defn -main  ; имя  [ &  арг ]  ; (переменные) параметры  ( Println "Hello, World!" ))  ; тело

Программирование на REPL [ править ]

Как и в других Лиспах , одной из знаковых особенностей Clojure является интерактивное программирование в REPL . [128] Обратите внимание, что в следующих примерах ;;начинается строковый комментарий и ;; =>указывается ожидаемый результат:

;; определить var ( def a  42 ) ;; => # 'пользователь / а;; вызвать функцию с именем `+` ( + a  8 ) ;; => 50;; вызвать функцию с именем `even?` ( even?  a ) ;; => правда;; определить функцию, которая возвращает остаток от `n` при делении на 10 ( defn foo  [ n ]  ( rem n  10 )) ;; => # 'user / foo;; вызвать функцию ( foo  a ) ;; => 2;; вывести строку документации `rem` ( doc rem ) ;; => ------------------------- clojure.core / rem ([ num  div ])  остаток  от  деления  числителя  на  знаменатель.;; распечатать источник `rem` ( source  rem ) ;; => ( defn rem  "остаток от деления числителя на знаменатель."  { : добавлено  "1.0"  : static  true  : inline  ( fn [ x  y ]  ` ( . clojure.lang.Numbers  ( остаток  ~ x  ~ y )))}  [ Num  DIV ]  ( . clojure.lang.Numbers  ( остальное  Num  DIV )))

Имена во время выполнения [ править ]

В отличие от других сред выполнения, в которых имена компилируются, среда выполнения Clojure легко анализируется с помощью обычных структур данных Clojure:

;; определить var ( def a  42 ) ;; => # 'пользователь / а;; получить карту всей общественности VARS интернирован в `user` имен ( NS-PUBLICS пользователя» ) ;; => {a # 'user / a};; ссылаться на переменную через `# '` (макрос чтения) и ;; связанный с ним символ с указанием пространства имен `user / a` # 'user / a ;; => # 'пользователь / а;; разорвать ссылку (получить значение) переменной var ( deref # 'user / a ) ;; => 42;; определить функцию (со строкой документации), которая ;; возвращает остаток от `n` при делении на 10 ( defn foo  " возвращает `(rem n 10)` "  [ n ]  ( rem n  10 )) ;; => # 'user / foo;; получить метаданные переменной `# 'user / foo` ( meta # ' user / foo ) ;; => { : Arglists  ([ п ]) , : Doc  "возвращает` (рем N 10) `" , : линии  1 , : колонка  1 , : файл  "user.clj" , : Имя  Foo , : нс  # пространства имен [ пользователь ]}

Код как данные (гомоиконность) [ править ]

Подобно другим Лиспам , Clojure гомиконичен (также известен как код как данные ). В приведенном ниже примере мы видим, насколько легко написать код, изменяющий сам код:

;; вызвать функцию (код) ( + 1  1 ) ;; => 2;; цитировать вызов функции ;; (превращение кода в данные, которые представляют собой список символов) ( quote ( + 1  1 )) ;; => (+ 1 1);; получить первый элемент в списке ;; (оперируя кодом как данными) ( first ( quote ( + 1  1 ))) ;; => +;; получить последний элемент в списке ;; (работает с кодом как с данными) ( last ( quote ( + 1  1 ))) ;; => 1;; получить новый список, заменив символы в исходном списке ;; (манипулирование кодом как данными) ( map ( fn [ form ]  ( case  form  1  'one  + ' plus ))  ( quote ( + 1  1 ))) ;; => (плюс один)

Выразительные операторы для преобразования данных [ править ]

Макросы потоковой передачи ( ->, ->>и друзья) могут синтаксически выражать абстракцию конвейерной передачи коллекции данных через серию преобразований:

( - >>  ( диапазон 10 )  ( карта вкл. )  ( четный фильтр ? )) ;; => (2 4 6 8 10)

Этого также можно добиться более эффективно с помощью датчиков:

( последовательность  ( comp ( map inc )  ( фильтровать даже? ))  ( диапазон 10 )) ;; => (2 4 6 8 10)

Поточно-безопасное управление идентичностью и состоянием [ править ]

Поточно- генератор уникальных серийных номеров (хотя, как и многие другие диалекты Lisp, Clojure имеет встроенную gensymфункцию , которая использует внутренне):

( определение я  ( атом  0 ))( defn generate-unique-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` со всей печатью на `* из *` притихли."  [ &  Форму ]  ` ( связывание [ * из *  битовой ковшовой писательницы ]  \ @ форма ))( noprint  ( println "Привет, никто!" )) ;; => ноль

Совместимость языков с Java [ править ]

Clojure был создан с нуля, чтобы охватить свои хост-платформы в качестве одной из целей разработки и, таким образом, обеспечить отличную языковую совместимость с Java:

;; вызвать метод экземпляра ( .toUpperCase  "яблоко" ) ;; => «ЯБЛОКО»;; вызвать статический метод ( System / getProperty  "java.vm.version" ) ;; => «12 + 33»;; создать экземпляр `java.util.HashMap` и ;; добавить несколько записей ( doto ( java.util.HashMap. )  ( .put  "apple"  1 )  ( .put  "banana"  2 )) ;; => {"банан" 2, "яблоко" 1};; создать экземпляр `java.util.ArrayList` и ;; увеличивать его элементы с помощью `clojure.core / map` ( def al  ( doto ( java.util.ArrayList. )  ( .add  1 )  ( .add  2 )  ( .add  3 )))( карта inc al ) ;; => (2 3 4);; показать диалоговое окно сообщения с использованием Java Swing ( javax.swing.JOptionPane / showMessageDialog  nil  "Hello, World!" ) ;; => ноль

Программная транзакционная память [ править ]

10 потоков, управляющих одной общей структурой данных, состоящей из 100 векторов, каждый из которых содержит 10 (изначально последовательных) уникальных чисел. Затем каждый поток несколько раз выбирает две случайные позиции в двух случайных векторах и меняет их местами. Все изменения векторов происходят в транзакциях с использованием системы транзакционной памяти программного обеспечения Clojure :

( defn run  [ nvecs  nitems  nthreads  niters ]  ( let [ vec-refs  ( - >>  ( * nvecs  nitems )  ( range )  ( into [])  ( comp ( partition-all  nitems )  ( map vec )  ( map ref )))) 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  # ( - >>  vec-refs  ( into []  ( comp ( map deref )  ( map ( fn [ v ]  ( prn v )  v ))  cat  ( independent ))]  ( count )  ( println "Distinct:" )) ] ( отчет ) ( - >>  # ( dotimes [ _  niters ]  ( swap ))  ( repeat nthreads )  ( apply pcalls )  ( dorun )) ( отчет )))( запуск  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 ] Различное :  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 ] Отдельно :  1000 ноль

См. Также [ править ]

  • Список языков JVM
  • Список языков интерфейса командной строки
  • Сравнение языков программирования

Ссылки [ править ]

  1. ^ a b «Агенты и асинхронные действия» . Clojure.org . Проверено 7 июля 2019 .
  2. ^ «Параллельное программирование» . Clojure.org . Проверено 7 июля 2019 .
  3. ^ Хикки, Рич; участники. "core.async" . GitHub.com . Проверено 7 июля 2019 .
  4. ^ «Функциональное программирование» . Clojure.org . Проверено 7 июля 2019 .
  5. ^ Нолен, Дэвид; Хики, Рич; участники. "core.logic" . GitHub.com . Проверено 7 июля 2019 .
  6. ^ a b «Макросы» . Clojure.org . Проверено 7 июля 2019 .
  7. ^ Эстерхази, Паулюс. «Руководство по макросам потоков» . Clojure.org . Проверено 7 июля 2019 .
  8. ^ a b Миллер, Алекс (2021-03-04). «Релиз Clojure 1.10.3» . Clojure.org .
  9. ^ Фогус, Майкл (2011). "Rich Hickey Q&A" . CodeQuarterly.com . Архивировано из оригинала на 2017-01-11.
  10. ^ Хикки, Рич. "Книжная полка Clojure" . Amazon.com . Архивировано из оригинала на 2017-10-03 . Проверено 7 июля 2019 .
  11. ^ Боннер-сержант, Амвросий (2012). Практическая система дополнительных типов для Clojure (тезис). Университет Западной Австралии.
  12. ^ "Программирование на Clojure" (PDF) . OReilly.com . Проверено 30 апреля 2013 .
  13. ^ Болдридж, Тимоти. «Пикси» . PixieLang.org . Проверено 7 июля 2019 .
  14. ^ Рамачандра, Рамкумар. «Рейн» . GitHub.org . Проверено 7 июля 2019 .
  15. ^ a b c d e Эдвардс, Кэтрин (10 августа 2009 г.). "Азия языков программирования: Clojure" . Computerworld.com.au . Архивировано из оригинала на 2019-08-26.
  16. ^ a b Хикки, Рич (2009-01-05). "значение и произношение Clojure" . Google.com .
  17. ^ a b Крилл, Пол (2012-03-22). «Изобретатель Clojure Хики теперь нацелен на Android» . InfoWorld.com .
  18. ^ a b "Clojure" . Clojure.org . Проверено 7 июля 2019 .
  19. ^ a b «Отличия от других Лиспов» . Clojure.org . Проверено 7 июля 2019 .
  20. ^ a b «Развитие» . Clojure.org . Проверено 7 июля 2019 .
  21. ^ Хикки, Рич (2018-11-26). «Открытый исходный код - это не о тебе» . GitHub.com .
  22. ^ a b c «Ценности и изменения: подход Clojure к идентичности и состоянию» . Clojure.org . Проверено 7 июля 2019 .
  23. ^ a b Хикки, Рич. «Обоснование» . Clojure.org . Проверено 7 июля 2019 .
  24. ^ а б Торре, Чарльз (2009-10-06). «От эксперта к эксперту: Рич Хики и Брайан Бекман - Inside Clojure» . MSDN.com .
  25. ^ "core.typed" . GitHub.com . Проверено 7 июля 2019 .
  26. ^ "Инвестирование в лучший способ" . Cognitect.com . Проверено 7 июля 2019 .
  27. ^ "Clojure / con" . Clojure-Conj.org . Проверено 7 июля 2019 .
  28. ^ Хикки, Рич (2002-10-16). «[ANN] dotLisp - диалект Лиспа для .Net» . Google.com .
  29. ^ Хикки, Рич (2013-04-15). "jfli" . SourceForge.net .
  30. ^ Хикки, Рич (2013-04-03). «фольга - Интерфейс посторонних объектов для Лиспа» . SourceForge.net .
  31. ^ Хикки, Рич (2013-03-07). «Лисплеты» . SourceForge.net .
  32. ^ "Clojure" . Atlassian.net . Проверено 7 июля 2019 .
  33. ^ "Clojure" . Google.com . Проверено 7 июля 2019 .
  34. ^ "Форум Clojure" . clojure.org . Проверено 20 марта 2020 .
  35. ^ «Соглашение с автором» . Clojure.org . Проверено 7 июля 2019 .
  36. ^ «Рабочий процесс» . Clojure.org . Проверено 7 июля 2019 .
  37. ^ Элмендорф, Дирк (01.04.2010). "Компьютерщик размера экономики - Интервью с Ричем Хики, создателем Clojure" . LinuxJournal.com .
  38. ^ Хикки, Рич (2007-10-16). "Clojure is Two!" . BlogSpot.com .
  39. ^ Хикки, Рич (2009-05-04). «Clojure 1.0» . BlogSpot.com .
  40. ^ Хикки, Рич (2009-12-31). «Выпуск Clojure 1.1» . BlogSpot.com .
  41. ^ Хикки, Рич (2010-08-19). «Выпуск Clojure 1.2» . Google.com .
  42. ^ Redinger, Кристофер (2011-09-23). "[ANN] Выпущен Clojure 1.3" . Google.com .
  43. ^ Диперт, Алан (2012-04-17). "[ANN] Выпущен Clojure 1.4" . Google.com .
  44. ^ Халлоуэй, Стюарт (2013-03-01). «ИНН: Clojure 1.5» . Google.com .
  45. ^ Халлоуэй, Стюарт (2013-03-10). «Clojure 1.5.1» . Google.com .
  46. ^ Миллер, Алекс (2014-03-25). "[ANN] Clojure 1.6" . Google.com .
  47. ^ a b Миллер, Алекс (30.06.2015). «Clojure 1.7 теперь доступен» . Clojure.org .
  48. ^ Миллер, Алекс (2016-01-19). «Clojure 1.8 теперь доступен» . Clojure.org .
  49. ^ Миллер, Алекс (2017-12-08). «Clojure 1.9 теперь доступен» . Clojure.org .
  50. ^ Миллер, Алекс (2018-12-17). «Релиз Clojure 1.10» . Clojure.org .
  51. ^ Миллер, Алекс (2019-06-06). «Релиз Clojure 1.10.1» . Clojure.org .
  52. ^ Миллер, Алекс (2021-01-26). «Релиз Clojure 1.10.2» . Clojure.org .
  53. ^ a b «Размещено на JVM» . Clojure.org . Проверено 7 июля 2019 .
  54. ^ "Java Interop" . Clojure.org . Проверено 7 июля 2019 .
  55. ^ Хагельберг, Фил; участники. «Лейнинген» . Leiningen.org . Проверено 7 июля 2019 .
  56. ^ a b c "Читатель" . Clojure.org . Проверено 7 июля 2019 .
  57. ^ Хикки, Рич. "edn" . GitHub.com . Проверено 7 июля 2019 .
  58. ^ «Мультиметоды и иерархии» . Clojure.org . Проверено 7 июля 2019 .
  59. ^ «Протоколы» . Clojure.org . Проверено 7 июля 2019 .
  60. ^ «Типы данных: deftype, defrecord и reify» . Clojure.org . Проверено 7 июля 2019 .
  61. ^ Гетц, Брайан (2014-11-20). «Управление: отрезвляющие части» . YouTube.com .
  62. ^ Роуз, Джон (2007-07-12). "хвостовые вызовы в ВМ" . Oracle.com .
  63. ^ Роза, Джон (2009-02-11). «Некоторые языки должны иметь возможность выполнять хвостовые вызовы» . Java.net .
  64. ^ «Особые формы» . Clojure.org . Проверено 7 июля 2019 .
  65. ^ «Ссылки и транзакции» . Clojure.org . Проверено 7 июля 2019 .
  66. ^ Хикки, Рич (2013-06-28). "Каналы Clojure core.async" . Clojure.org .
  67. ^ Хикки, Рич (2014-09-17). «Преобразователи» . YouTube.com .
  68. ^ Хикки, Рич (2014-08-06). «Преобразователи идут» . Cognitect.com .
  69. ^ Хикки, Рич (2014-11-20). «Внутренние преобразователи» . YouTube.com .
  70. ^ "ClojureScript" . ClojureScript.org . Проверено 6 июля 2019 .
  71. ^ «ClojureScript - FAQ (для разработчиков JavaScript)» . ClojureScript.org . Проверено 4 февраля 2018 .
  72. ^ "ClojureCLR" . GitHub.com . Проверено 28 июня 2012 .
  73. ^ Эмерик, Чес (2013-11-18). «Результаты исследования состояния Clojure и ClojureScript за 2013 год» . CEmerick.com .
  74. ^ «Состояние результатов исследования Clojure 2014» . WuFoo.com . Проверено 17 сентября 2015 .
  75. ^ Gehtland, Джастин (2016-01-28). «Результаты исследования состояния Clojure 2015» . Cognitect.com .
  76. ^ «Реагент» . GitHub.io . Проверено 6 июля 2019 .
  77. ^ "переделать" . GitHub.com . Проверено 6 июля 2019 .
  78. Прокопов, Никита. «Ром» . GitHub.com . Проверено 6 июля 2019 .
  79. ^ Нолен, Дэвид. "Ом" . GitHub.com . Проверено 6 июля 2019 .
  80. ^ Coupland, Том (2014-01-17). «Ом: Улучшение реакции Facebook с неизменяемостью» . InfoQ.com .
  81. ^ Ху, Вэй. «Лисп на Perl» . MetaCPAN.org . Проверено 6 июля 2019 .
  82. ^ Факорро, Хуан. «Clojerl» . GitHub.com . Проверено 6 июля 2019 .
  83. ^ Болдридж, Тимоти. "кложур-ру" . GitHub.com . Проверено 6 июля 2019 .
  84. ^ Akkaya, Нуруллах. «Хорек» . Ferret-Lang.org . Проверено 6 июля 2019 .
  85. ^ Батаев, Роман. «Джокер» . Joker-Lang.org . Проверено 6 июля 2019 .
  86. ^ Cannon, Aemon. «Лаз3р» . GitHub.com . Проверено 6 июля 2019 .
  87. ^ Болдридж, Тимоти. «Пикси» . PixieLang.org . Проверено 6 июля 2019 .
  88. ^ Коннор, Эш. «Руж» . GitHub.com . Проверено 6 июля 2019 .
  89. ^ Гетц, Брайан (2020-05-24). «Любимый не-Java язык JVM Брайана Гетца (часть 1 из 3)» . Twitch.tv .
  90. ^ Гетц, Брайан (2020-05-24). «Любимый не-Java язык JVM Брайана Гетца (Часть 2 из 3)» . Twitch.tv .
  91. ^ Гетц, Брайан (2020-05-24). «Любимый не-Java язык JVM Брайана Гетца (часть 3 из 3)» . Twitch.tv .
  92. ^ Эванс, Эрик (2018-08-14). «Время моделирования - Эрик Эванс - предметно-ориентированный дизайн, Европа 2018» . YouTube.com .
  93. ^ Эванс, Эрик (2014-11-21). «Эрик Эванс в Твиттере» . Twitter.com .
  94. ^ "Встреча Джеймса Гостлинга с лондонским сообществом Java" . YouTube.com . 2016-10-11.
  95. ^ Грэм, Пол (2016-05-06). «Пол Грэм в Твиттере» . Twitter.com .
  96. ^ Мартин, Роберт (2019-08-22). "Почему именно Clojure?" . CleanCoder.com .
  97. ^ Мартин, Роберт (2018-11-29). «Неблагоприятный Боб Мартин в Твиттере» . Twitter.com .
  98. ^ Мартин, Роберт (2018-08-01). «Введение в функциональное программирование» . CleanCoders.com .
  99. ^ Мартин, Роберт (2017-07-11). «Прагматическое функциональное программирование» . CleanCoder.com .
  100. ^ «Часто задаваемые вопросы - Технологический радар - ThoughtWorks» . ThoughtWorks.com . Проверено 10 февраля 2019 .
  101. ^ "Clojure - Технологический радар - ThoughtWorks" . ThoughtWorks.com . Проверено 10 февраля 2019 .
  102. ^ Клен, Саймон; Бинсток, Эндрю (2018-10-17). «Отчет об экосистеме JVM 2018» . Snyk.io .
  103. ^ «Истории успеха» . Clojure.org . Проверено 27 октября 2018 .
  104. ^ Liutikov, Роман (2017-12-17). «Роман Лютиков в Твиттере» . Twitter.com .
  105. ^ «Работа в Apple» . Apple.com . Проверено 6 июля 2019 .
  106. Борхес, Леонардо (07.07.2015). «Сотрудничество с Clojure в реальном времени» . YouTube.com .
  107. ^ Питер, Джон (2016-10-04). "Clojure в Лондоне: круг финансирования - предоставление немного Clojure" . JUXT.pro .
  108. ^ Уильямс, Алекс (2014-08-03). «Новые создатели стека: Адриан Кокрофт о Sun, Netflix, Clojure, Go, Docker и многом другом» . TheNewStack.io .
  109. ^ Прайс, Крис (2014-04-11). «Новая эра прикладных сервисов в Puppet Labs» . Puppet.com . Проверено 6 августа 2020 .
  110. ^ Филлипс, Марк (2015-07-14). «Walmart запускает Clojure в масштабе» . Cognitect.com .
  111. ^ «Общий репозиторий метаданных» . GitHub.com . Проверено 6 июля 2019 .
  112. ^ Мейер, Карин (2015-05-06). «Творческие вычисления с Clojure» . OReilly.com .
  113. ^ Миллер, Алекс (2019-02-04). « » Состояние Clojure 2019" Результаты» . Clojure.org .
  114. ^ Сабо, Маурисио. «Хлор: клиент REPL для сокетов для Clojure и ClojureScript» . Atom.io . Проверено 5 июля 2019 .
  115. ^ Бацов, Божидар; участники. "CIDER: потрясающая интерактивная среда разработки Clojure" . CIDER.mx . Проверено 5 июля 2019 .
  116. ^ Шраго, Грег. «Clojure-Kit: плагин Clojure и ClojureScript для инструментов на основе IntelliJ» . JetBrains.com . Проверено 5 июля 2019 .
  117. ^ Флеминг, Колин. «Cursive: Обеспечивает полную поддержку языков Clojure и ClojureScript» . JetBrains.com . Проверено 5 июля 2019 .
  118. ^ Папа, Тим. "cam.vim: поддержка REPL Clojure " . VIM.org . Проверено 5 июля 2019 .
  119. ^ Монро, Dominic (2016-12-13). «Clojure и Vim: обзор - вполне возможно» . JUXT.pro .
  120. Масаши, Иидзука. "vim-iced: Интерактивная среда разработки Clojure для Vim8 / Neovim" . GitHub.com . Проверено 13 марта 2020 .
  121. ^ Колдуэлл, Оливер. "Инструменты Neovim Clojure (Script) поверх препл" . GitHub.com . Проверено 9 ноября 2019 .
  122. ^ Колдуэлл, Оливер (2019-11-06). «Начало работы с Clojure, Neovim и Conjure за считанные минуты» . oli.me.uk .
  123. ^ Strömberg, Питер. "Calva: интерактивное программирование на Clojure и ClojureScript" . VisualStudio.com . Проверено 5 июля 2019 .
  124. ^ Сабо, Маурисио. «Клевер» . VisualStudio.com . Источник 2021-01-28 .
  125. ^ a b Миллер, Алекс. «Deps and CLI Guide» . Clojure.org . Проверено 8 июля 2019 .
  126. ^ Миллер, Алекс (2017-12-08). "Clojure 1.9" . Cognitect.com .
  127. ^ "Интернет Clojure REPL" . REPL.it . Проверено 8 июля 2019 .
  128. ^ «Программирование на REPL: Введение» . Clojure.org . Проверено 4 декабря 2018 .

Дальнейшее чтение [ править ]

  • Сотников, Дмитрий (2020), Веб-разработка с Clojure (3-е изд.), Pragmatic Bookshelf , ISBN 978-1-68050-682-2
  • Олсен, Расс (2018), Получение Clojure , Pragmatic Bookshelf , ISBN 978-1-68050-300-5
  • Миллер, Алекс; Хэллоуэй, Стюарт; Бедра, Аарон (2018), Программирование Clojure (3-е изд.), Pragmatic Bookshelf , ISBN 978-1-68050-246-6
  • Ратор, Амит; Авила, Фрэнсис (2015), Clojure в действии (2-е изд.), Мэннинг , ISBN 978-1-61729-152-4
  • Хиггинботэм, Дэниел (2015), Clojure для храбрых и правдивых , No Starch Press , ISBN 978-1-59327-591-4
  • Гэмбл, Джулиан (2015), Clojure Recipes , Pearson Publishing , ISBN 978-0-32192-773-6
  • Вандгрифт, Бен; Миллер, Алекс (2015), Clojure Applied , Pragmatic Bookshelf , ISBN 978-1-68050-074-5
  • Рочестер, Эрик (2015), Поваренная книга анализа данных Clojure (2-е изд.), Packt Publishing , ISBN 978-1-78439-029-7
  • Фогус, Майкл; Хаузер, Крис (2014), Радость Clojure (2-е изд.), Мэннинг , ISBN 978-1-617291-41-8
  • Келкер, Райан (2013), Clojure для доменных языков , Packt Publishing , ISBN 978-1-78216-650-4
  • Рочестер, Эрик (2014), Освоение анализа данных Clojure , Packt Publishing , ISBN 978-1-78328-413-9
  • Эмерик, Час; Карпер, Брайан; Гранд, Кристоф (19 апреля 2012 г.), Clojure Programming , O'Reilly Media , ISBN 978-1-4493-9470-7
  • Вандерхарт, Люк; Сьерра, Стюарт (7 июня 2010 г.), Практический Clojure , Apress , ISBN 978-1-4302-7231-1

Внешние ссылки [ править ]

Официальный веб-сайт