Как и большинство других Lisp, синтаксис Clojure построен на S-выражениях , которые сначала разбираются на структуры данных считывателем Lisp перед компиляцией . [21] [17] Считыватель Clojure поддерживает литеральный синтаксис для карт , множеств и векторов , а также списков, и они компилируются в упомянутые структуры напрямую. [21] Clojure рассматривает код как данные и имеет систему макросов Lisp . [22] Clojure является Lisp-1 и не предназначен для совместимости с другими диалектами Lisp, поскольку он использует свой собственный набор структур данных, несовместимых с другими Lisp. [22]
Clojure выступает за неизменяемость и неизменяемые структуры данных и призывает программистов быть явными в управлении идентичностью и ее состояниями. [23] Этот акцент на программировании с неизменяемыми значениями и явными конструкциями прогрессии времени призван облегчить разработку более надежных, особенно параллельных , программ, которые являются простыми и быстрыми. [24] [25] [17] Хотя его система типов полностью динамическая , недавние попытки также были направлены на реализацию зависимой системы типов . [26]
Рич Хики — создатель языка 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 к состоянию характеризуется концепцией идентичностей, [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 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 на разных платформах включают:
Бабашка, [57] Родной язык сценариев Clojure, использующий собственный образ GraalVM и Small Clojure Interpreter
CljPerl, [58] Clojure на Perl
ClojureDart, [59] Расширьте возможности Clojure для мобильных и настольных приложений, перенеся Clojure на Dart и Flutter
Pixie, [67] диалект Lisp, вдохновленный Clojure, написанный на RPython
Rouge, [68] Clojure на YARV в Ruby
Инструменты
Инструментарий для разработки 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]
^ Монро, Доминик (13.12.2016). «Clojure и Vim: обзор – это вполне возможно». JUXT.pro .
^ Масаси, Иидзука (29.04.2024). "vim-elin: среда разработки Clojure для Vim/Neovim, в основном написанная на Babashka". GitHub . Архивировано из оригинала 02.05.2024 . Получено 02.05.2024 .