Clojure


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

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

Как и в любом другом Лиспе, синтаксис Clojure основан на S-выражениях, которые перед компиляцией транслируются синтаксическим анализатором в структуры данных. Синтаксический анализатор Clojure поддерживает, помимо обычных списков, синтаксис литералов для ассоциативных массивов, множеств и векторов, передавая затем все эти структуры данных компилятору. Иначе говоря, компилятор Clojure компилирует не только списковые структуры данных, но и напрямую поддерживает все указанные типы.

Хотя Clojure является расширением изначальной версии Lisp, он не совместим с Lisp’ом, то есть программа на любой из современных версий Lisp’а (за исключением, возможно, самых коротких, примитивных и, к тому же, специально подобранных примеров) либо вообще не пройдёт транслятор Clojure, либо будет выполняться неправильно. Отличия от распространённых версий Lisp’а приведены на сайте языка[4]. Вот некоторые из них:

Анонимный подкласс java.io.Writer который ничего не выводит и макрос, используемый чтобы заглушить весь вывод внутри него:

10 потоков, манипулирующих одной общей структурой данных, которая состоит из 100 векторов, каждый из которых содержит 10 (изначально последовательных) уникальных чисел. Каждый поток многократно выбирает две случайных позиции в двух случайных векторах и обменивает местами их значения. Все изменения векторов происходят в единой транзакции путём использования системы транзакционной памяти clojure. Поэтому даже после 1000 итераций в каждом из потоков числа не теряются.