stringtranslate.com

Кложур

Clojure ( / ˈ k l ʒ ər / , как и замыкание ) [17] [18] — это динамический и функциональный диалект языка программирования Lisp на платформе Java . [19] [20]

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

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

Язык был создан Ричем Хики в середине 2000-х годов, изначально для платформы Java; с тех пор язык был портирован на другие платформы, такие как Common Language Runtime (.NET). Хики продолжает руководить разработкой языка как его благосклонный диктатор на всю жизнь .

История

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

Рич Хики — создатель языка Clojure. [19] До Clojure он разработал dotLispаналогичный проект на основе платформы .NET , [27] и три более ранних попытки обеспечить взаимодействие между Lisp и Java : интерфейс иностранного языка Java для Common Lisp ( jfli), [28] Интерфейс внешних объектов для Lisp (FOIL), [29] и дружественный Lisp интерфейс для сервлетов Java (Lisplets). [30]

Хики провел около двух с половиной лет, работая над Clojure, прежде чем выпустить его публично в октябре 2007 года, [31] большую часть этого времени работая исключительно над Clojure без внешнего финансирования. В конце этого времени Хики отправил электронное письмо с анонсом языка нескольким друзьям в сообществе Common Lisp.

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

Дизайн

Рич Хики разработал Clojure, потому что он хотел современный Lisp для функционального программирования , симбиотический с устоявшейся платформой Java и разработанный для параллелизма . [24] [25] [32] [17] Он также подчеркивал важность простоты в проектировании языков программирования и архитектуре программного обеспечения, выступая за слабую связанность , полиморфизм через протоколы и классы типов вместо наследования , функции без состояния , которые находятся в пространстве имен вместо методов или замену синтаксиса данными . [33] [34] [35]

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

Clojure работает на платформе Java и, как следствие, интегрируется с Java и полностью поддерживает вызов кода Java из Clojure, [36] [17] и код Clojure также может быть вызван из Java. [37] Сообщество использует такие инструменты, как интерфейс командной строки Clojure (CLI) [38] или Leiningen для автоматизации проектов, обеспечивая поддержку интеграции Maven . Эти инструменты управляют управлением пакетами проекта и зависимостями и настраиваются с использованием синтаксиса Clojure.

Как диалект Lisp, Clojure поддерживает функции как объекты первого класса , цикл read–eval–print (REPL) и систему макросов. [6] Система макросов Lisp Clojure очень похожа на систему Common Lisp , за исключением того, что версия обратной кавычки Clojure (называемая «синтаксической кавычкой») квалифицирует символы с их пространством имен . Это помогает предотвратить непреднамеренный захват имени, поскольку привязка к именам, квалифицированным пространством имен, запрещена. Можно принудительно расширить макрос захвата, но это должно быть сделано явно. Clojure не допускает определяемых пользователем макросов чтения, но читатель поддерживает более ограниченную форму синтаксического расширения. [39] Clojure поддерживает мультиметоды [40] и для абстракций, подобных интерфейсу, имеет основанный на протоколе [41] полиморфизм и систему типов данных, использующую записи [42] , обеспечивая высокопроизводительный и динамический полиморфизм, разработанный для избежания проблемы выражения .

Clojure поддерживает ленивые последовательности и поощряет принцип неизменяемости и постоянные структуры данных . Как функциональный язык , акцент делается на рекурсии и функциях высшего порядка вместо циклов на основе побочных эффектов. Автоматическая оптимизация хвостовых вызовов не поддерживается, поскольку JVM не поддерживает ее изначально; [43] [44] [45] это можно сделать явно, используя recurключевое слово . [46] Для параллельного и одновременного программирования Clojure предоставляет программную транзакционную память , [47] систему реактивных агентов , [1] и параллельное программирование на основе каналов . [48]

Clojure 1.7 представил условные операторы чтения, разрешив встраивание кода Clojure, ClojureScript и ClojureCLR в одно и то же пространство имен. [49] [21] Трансдьюсеры были добавлены как метод для составления преобразований. Трансдьюсеры позволяют функциям более высокого порядка, таким как map и fold , обобщать любые источники входных данных. В то время как традиционно эти функции работают с последовательностями , трансдьюсеры позволяют им работать с каналами и позволяют пользователю определять свои собственные модели для преобразования. [50] [51] [52]

Расширяемая нотация данных

Extensible Data Notation , или edn , [53] — это подмножество языка Clojure, предназначенное как формат передачи данных. Его можно использовать для сериализации и десериализации структур данных Clojure, а сам Clojure использует надмножество edn для представления программ.

edn используется аналогично JSON или XML , но имеет относительно большой список встроенных элементов, показанных здесь с примерами:

В дополнение к этим элементам он поддерживает расширяемость за счет использования тегов , которые состоят из символа #, за которым следует символ. При обнаружении тега считыватель передает значение следующего элемента соответствующему обработчику, который возвращает значение данных. Например, это может быть помеченный элемент: #myapp/Person {:first "Fred" :last "Mertz"}, интерпретация которого будет зависеть от соответствующего обработчика считывателя.

Такое определение элементов расширения с точки зрения других позволяет избежать необходимости полагаться на соглашения или контекст для передачи элементов, не включенных в базовый набор.

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

Основная платформа Clojure — Java , [20] [36], но существуют и другие целевые реализации. Наиболее заметными из них являются ClojureScript, [54] , который компилируется в ECMAScript 3, [55] и ClojureCLR, [56] полный порт на платформе .NET , совместимый с ее экосистемой.

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

Инструменты

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

В дополнение к инструментам, предоставляемым сообществом, официальные инструменты интерфейса командной строки (CLI) Clojure [38] также стали доступны на Linux , macOS и Windows, начиная с Clojure 1.9. [83]

Разработка

Процесс разработки ограничен основной командой Clojure, хотя проблемы видны публично на странице проекта Clojure JIRA . [84] Любой может задавать вопросы или отправлять проблемы и идеи на ask.clojure.org. [85] Если будет установлено, что новая проблема требует тикета JIRA, член основной команды рассмотрит ее и добавит. Проблемы JIRA обрабатываются командой скринеров и окончательно утверждаются Ричем Хики. [86] [87]

Влияние

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

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

В выпуске Stack Overflow Developer Survey 2023 года Clojure был четвертым по популярности в категории языков программирования и сценариев, причем 68,51% респондентов, которые работали с ним в прошлом году, заявили, что хотели бы продолжать его использовать. Однако в желаемой категории его отметили как таковой только 2,2% опрошенных, тогда как JavaScript с наивысшей оценкой был желаем 40,15% разработчиков, участвовавших в опросе. [113]

История релизов

Смотрите также

Ссылки

  1. ^ ab "Агенты и асинхронные действия". Clojure.org . Получено 2019-07-07 .
  2. ^ "Параллельное программирование". Clojure.org . Получено 2019-07-07 .
  3. ^ Хики, Рич; участники. "core.async". GitHub . Получено 2019-07-07 .
  4. ^ "Функциональное программирование". Clojure.org . Получено 2019-07-07 .
  5. ^ Нолен, Дэвид; Хики, Рич. "core.logic". GitHub . Получено 07.07.2019 .
  6. ^ ab "Макросы". Clojure.org . Получено 2019-07-07 .
  7. ^ Эстерхази, Паулюс. «Руководство по потоковой передаче макросов». Clojure.org . Получено 07.07.2019 .
  8. ^ ab Миллер, Алекс (2024-03-08). "Выпуск Clojure 1.11.2". Clojure.org .
  9. ^ Фогус, Майкл (2011). "Rich Hickey Q&A". CodeQuarterly.com . Архивировано из оригинала 2017-01-11.
  10. ^ Хики, Рич (2011). «Простое стало легким». YouTube .[ нужен лучший источник ]
  11. ^ Боннер-Сержант, Эмброуз (2012). Практическая система дополнительных типов для Clojure (диссертация). Университет Западной Австралии.
  12. ^ "Программирование на Clojure" (PDF) . OReilly.com . Получено 2013-04-30 .
  13. ^ Хики, Рич. "Clojure Bookshelf". Amazon.com . Архивировано из оригинала 2017-10-03 . Получено 2019-07-07 .
  14. ^ Роуз, Кэлвин; соавторы. "Janet Language". Janet-Lang.org . Получено 2023-02-18 .
  15. ^ Болдридж, Тимоти. "Pixie". PixieLang.org . Получено 07.07.2019 .
  16. ^ Рамачандра, Рамкумар. «Рейн». Гитхаб . Проверено 7 июля 2019 г.
  17. ^ abcde Эдвардс, Кэтрин (2009-08-10). "Языки программирования от А до Я: Clojure". Computerworld.com.au . Архивировано из оригинала 2019-08-26.
  18. ^ ab Хики, Рич (2009-01-05). "значение и произношение Clojure". Google.com .
  19. ^ ab Krill, Paul (2012-03-22). «Изобретатель Clojure Хики теперь нацелен на Android». InfoWorld.com .
  20. ^ ab "Clojure". Clojure.org . Получено 2019-07-07 .
  21. ^ abc "The Reader". Clojure.org . Получено 2019-07-07 .
  22. ^ ab "Различия с другими Lisp". Clojure.org . Получено 2019-07-07 .
  23. ^ abc "Ценности и изменения: подход Clojure к идентичности и государству". Clojure.org . Получено 2019-07-07 .
  24. ^ ab Хики, Рич. "Rationale". Clojure.org . Получено 07.07.2019 .
  25. ^ ab Torre, Charles (2009-10-06). «Эксперт эксперту: Рич Хики и Брайан Бекман – изнутри Clojure». MSDN.com .
  26. ^ "clojure/spec.alpha". GitHub . 2017-04-26.
  27. ^ Хики, Рич (16 октября 2002 г.). "[ANN] dotLisp: диалект Lisp для .Net". Google.com .
  28. Хики, Рич (15.04.2013). "jfli". SourceForge.net .
  29. ^ Хики, Рич (2013-04-03). "foil: Интерфейс внешних объектов для Lisp". SourceForge.net .
  30. ^ Хики, Рич (2013-03-07). "Lisplets". SourceForge.net .
  31. ^ ab Хики, Рич (2020-06-12). «История Clojure». Труды ACM по языкам программирования . 4 (HOPL): 1–46. doi : 10.1145/3386321 . S2CID  219603760.
  32. ^ Элмендорф, Дирк (01.04.2010). «Экономичный размер гика – интервью с Ричем Хики, создателем Clojure». LinuxJournal.com .
  33. ^ "Простое стало легким". InfoQ . Получено 2024-05-02 .
  34. ^ "(итерация, обдумывание, размышления): Преимущества программирования, ориентированного на данные". yogthos.net . Получено 2024-05-02 .
  35. ^ "talk-transcripts/Hickey_Rich/EffectivePrograms.md в master · matthiasn/talk-transcripts". GitHub . Получено 2024-05-02 .
  36. ^ ab "Размещено на JVM". Clojure.org . Получено 2019-07-07 .
  37. ^ "Java Interop". Clojure.org . Получено 2019-07-07 .
  38. ^ ab Miller, Alex. "Deps and CLI Guide". Clojure.org . Получено 2019-07-08 .
  39. ^ Хики, Рич. "edn". GitHub . Получено 07.07.2019 .
  40. ^ "Многометодность и иерархии". Clojure.org . Получено 2019-07-07 .
  41. ^ "Протоколы". Clojure.org . Получено 2019-07-07 .
  42. ^ "Типы данных: deftype, defrecord и reify". Clojure.org . Получено 2019-07-07 .
  43. ^ Гетц, Брайан (2014-11-20). «Управление: отрезвляющие части». YouTube.com .
  44. ^ Роуз, Джон (2007-07-12). "хвостовые вызовы в виртуальной машине". Oracle.com .
  45. ^ Роуз, Джон (2009-02-11). «Некоторые языки должны иметь возможность выполнять хвостовые вызовы». Java.net .
  46. ^ "Специальные формы". Clojure.org . Получено 2019-07-07 .
  47. ^ "Refs and Transactions". Clojure.org . Получено 2019-07-07 .
  48. ^ Хики, Рич (28.06.2013). «Clojure core.async Channels». Clojure.org .
  49. ^ ab Miller, Alex (2015-06-30). "Clojure 1.7 теперь доступен". Clojure.org .
  50. ^ Хики, Рич (2014-09-17). "Преобразователи". YouTube.com .
  51. ^ Хики, Рич (2014-08-06). «Преобразователи на подходе». Cognitect.com .
  52. ^ Хики, Рич (2014-11-20). «Внутренние преобразователи». YouTube.com .
  53. ^ "Официальная спецификация EDN". edn-format.org . 2022-04-27.
  54. ^ "ClojureScript". ClojureScript.org . Получено 2019-07-06 .
  55. ^ "ClojureScript – FAQ (для разработчиков JavaScript)". ClojureScript.org . Получено 2018-02-04 .
  56. ^ "ClojureCLR". GitHub . Получено 28.06.2012 .
  57. ^ Боркент, Михель. «Бабашка». Бабашка.орг . Проверено 19 августа 2019 г.
  58. ^ Ху, Вэй. "A Lisp on Perl". MetaCPAN.org . Получено 06.07.2019 .
  59. ^ "Что такое ClojureDart?", GitHub , Tensegritics, 2022-12-16 , получено 2022-12-16
  60. ^ Факорро, Хуан. "Clojerl". GitHub . Получено 06.07.2019 .
  61. ^ "basilisp". GitHub . Получено 2024-05-13 .
  62. ^ "ClojureRS". GitHub . Получено 2022-03-17 .
  63. ^ Аккая, Нурулла. «Хорек». Ferret-Lang.org . Проверено 6 июля 2019 г.
  64. ^ Вилкерсон, Джи. «джанк». Jank-Lang.org . Проверено 17 августа 2022 г.
  65. ^ Батаев, Роман. "Джокер". Joker-Lang.org . Получено 06.07.2019 .
  66. ^ Пушка, Эймон. «Лаз3р». Гитхаб . Проверено 6 июля 2019 г.
  67. ^ Болдридж, Тимоти. "Pixie". PixieLang.org . Получено 06.07.2019 .
  68. ^ Коннор, Эш. "Rouge". GitHub . Получено 06.07.2019 .
  69. ^ Миллер, Алекс (04.02.2019). "Результаты "State of Clojure 2019"". Clojure.org .
  70. ^ Бацов, Божидар; соавторы. "CIDER: The Clojure Interactive Development Environment that Rocks". CIDER.mx . Получено 05.07.2019 .
  71. ^ Флеминг, Колин. «Cursive: обеспечивает полную поддержку языков Clojure и ClojureScript». JetBrains.com . Получено 05.07.2019 .
  72. ^ Прокопов, Никита. «Clojure Sublimed». PackageControl.io . Проверено 18 февраля 2023 г.
  73. ^ Хелениус, Ээро. «Туткаин». FlowThing.me . Проверено 18 февраля 2023 г.
  74. ^ Поуп, Тим. "fireplace.vim: Clojure REPL Support". VIM.org . Получено 05.07.2019 .
  75. ^ Монро, Доминик (13.12.2016). «Clojure и Vim: обзор – это вполне возможно». JUXT.pro .
  76. ^ Масаси, Иидзука (29.04.2024). "vim-elin: среда разработки Clojure для Vim/Neovim, в основном написанная на Babashka". GitHub . Архивировано из оригинала 02.05.2024 . Получено 02.05.2024 .
  77. ^ Колдуэлл, Оливер. "Neovim Clojure(Script) tooling over prepl". GitHub . Получено 2019-11-09 .
  78. ^ Колдуэлл, Оливер (2019-11-06). «Начало работы с Clojure, Neovim и Conjure за считанные минуты» . oli.me.uk.
  79. ^ Стрёмберг, Питер. «Calva: Clojure & ClojureScript Interactive Programming». VisualStudio.com . Получено 05.07.2019 .
  80. ^ Сабо, Маурисио. "Клевер". VisualStudio.com . Проверено 28 января 2021 г.
  81. ^ clj-kondo/clj-kondo, clj-kondo, 30 апреля 2024 г. , получено 2 мая 2024 г.
  82. ^ "Обзор - Clojure LSP". clojure-lsp.io . Получено 2024-05-02 .
  83. ^ Миллер, Алекс (2017-12-08). "Clojure 1.9". Cognitect.com .
  84. ^ "Clojure". Atlassian.net . Получено 2019-07-07 .
  85. ^ "Форум Clojure". clojure.org . Получено 20.03.2020 .
  86. ^ Хики, Рич (2018-11-26). «Открытый исходный код — это не про вас». GitHub .
  87. ^ "Workflow". Clojure.org . Получено 2019-07-07 .
  88. ^ Гетц, Брайан (2020-05-24). «Любимый не-Java язык JVM Брайана Гетца (часть 1 из 3)». Twitch.tv .
  89. ^ Гетц, Брайан (24.05.2020). «Любимый язык JVM Брайана Гетца, не относящийся к Java (часть 2 из 3)». Twitch.tv .
  90. ^ Гетц, Брайан (2020-05-24). «Любимый не-Java язык JVM Брайана Гетца (часть 3 из 3)». Twitch.tv .
  91. ^ Эванс, Эрик (14 августа 2018 г.). «Время моделирования: Эрик Эванс: Domain-Driven Design Europe 2018». YouTube.com .
  92. ^ Эванс, Эрик (21.11.2014). "Эрик Эванс в Twitter". Twitter.com .
  93. ^ "Встреча Джеймса Гослинга с London Java Community". YouTube.com . 2016-10-11.
  94. ^ Грэм, Пол (2016-05-06). "Пол Грэм в Twitter". Twitter.com .
  95. ^ Мартин, Роберт (22.08.2019). «Почему Clojure?». CleanCoder.com .
  96. ^ Мартин, Роберт (29.11.2018). «Unble Bob Martin в Twitter». Twitter.com .
  97. ^ Мартин, Роберт (01.08.2018). «Введение в функциональное программирование». CleanCoders.com .
  98. ^ Мартин, Роберт (11 июля 2017 г.). «Прагматическое функциональное программирование». CleanCoder.com .
  99. ^ "Технологический радар | Мнение руководства по сегодняшнему технологическому ландшафту". Thoughtworks . Получено 2024-05-20 .
  100. ^ "Технологический радар: Clojure". ThoughtWorks.com . Получено 2019-02-10 .
  101. ^ Мейпл, Саймон; Бинсток, Эндрю (17.10.2018). "JVM Ecosystem Report 2018". Snyk.io .
  102. ^ "Истории успеха". Clojure.org . Получено 2018-10-27 .
  103. ^ Лютиков, Роман (17.12.2017). "Роман Лютиков в Twitter". Twitter.com .
  104. ^ "Работа в Apple". Apple.com . Получено 2019-07-06 .
  105. ^ Борхес, Леонардо (2015-07-07). «Совместная работа в реальном времени с Clojure». YouTube.com .
  106. ^ Pither, Jon (2016-10-04). «Clojure в Лондоне: Funding Circle – Lending some Clojure». JUXT.pro .
  107. ^ Уильямс, Алекс (03.08.2014). «Новые создатели стека: Эдриан Кокрофт о Sun, Netflix, Clojure, Go, Docker и многом другом». TheNewStack.io .
  108. ^ "Нубанк приобретает североамериканскую компанию по технологическому познанию" . 23 июля 2020 г.
  109. ^ Прайс, Крис (2014-04-11). «Новая эра прикладных служб в Puppet Labs». Puppet.com . Получено 2020-08-06 .
  110. ^ Филлипс, Марк (14 июля 2015 г.). «Walmart масштабирует Clojure». Cognitect.com .
  111. ^ "Common-Metadata-Repository". GitHub . Получено 2019-07-06 .
  112. ^ Мейер, Карин (2015-05-06). «Творческие вычисления с Clojure». OReilly.com .
  113. ^ "Опрос разработчиков Stack Overflow 2023". Stack Overflow . Получено 2024-05-02 .
  114. ^ Хики, Рич (2009-05-04). "Clojure 1.0". BlogSpot.com .
  115. ^ Хики, Рич (31.12.2009). "Clojure 1.1 Release". BlogSpot.com .
  116. ^ Хики, Рич (2010-08-19). "Clojure 1.2 Release". Google.com .
  117. ^ Редингер, Кристофер (23 сентября 2011 г.). «[ANN] Clojure 1.3 выпущен». Google.com .
  118. ^ Диперт, Алан (17.04.2012). "[ANN] Clojure 1.4 выпущен". Google.com .
  119. ^ Холлоуэй, Стюарт (01.03.2013). "ANN: Clojure 1.5". Google.com .
  120. ^ Холлоуэй, Стюарт (10.03.2013). "Clojure 1.5.1". Google.com .
  121. ^ Миллер, Алекс (25.03.2014). "[ANN] Clojure 1.6". Google.com .
  122. ^ Миллер, Алекс (19.01.2016). «Clojure 1.8 уже доступен». Clojure.org .
  123. ^ Миллер, Алекс (2017-12-08). "Clojure 1.9 уже доступен". Clojure.org .
  124. ^ Миллер, Алекс (17.12.2018). "Выпуск Clojure 1.10". Clojure.org .
  125. ^ Миллер, Алекс (06.06.2019). "Выпуск Clojure 1.10.1". Clojure.org .
  126. ^ Миллер, Алекс (2021-01-26). "Выпуск Clojure 1.10.2". Clojure.org .
  127. ^ Миллер, Алекс (04.03.2021). "Выпуск Clojure 1.10.3". Clojure.org .
  128. ^ Миллер, Алекс (2022-03-22). "Выпуск Clojure 1.11.0". Clojure.org .
  129. ^ Миллер, Алекс (2022-04-05). "Выпуск Clojure 1.11.1". Clojure.org .

Дальнейшее чтение

Внешние ссылки