Clojure
Материал из Xgu.ru
Clojure — диалект языка программирования Lisp для JVM, функциональный язык программирования.
Clojure опирается на основные принципы функционального программирования:
- отказ от изменяемых переменных (mutable state);
 - использование рекурсии и функций высокого порядка и д.р.
 
В Clojure используется динамическая типизация, однако при необходимости переменным может быть явно задан определенный тип, чтобы обеспечить максимальную производительность критически важных фрагментов кода.
Clojure не просто работает на JVM, он разрабатывался с учетом операционной совместимости с Java. Кроме того, создатели Clojure ориентировались на поддержку многопоточности, так что Clojure предоставляет разработчикам уникальные возможности для параллельного программирования[1].
Clojure является новым диалектом языка Lisp, сильно отличаясь от существующих в настоящее время диалектов, Common Lisp и Scheme. В Clojure появились свои собственные особые синтактические конструкции, призванные уменьшить количество скобок и сделать код более читаемым[2].
[править] Общие сведения Clojure
[править] Сильные стороны Clojure
[править] Слабые стороны Clojure
Clojure хорош всем. Но есть несколько спорных моментов, которые некоторым чаще других кажутся плохими. Нужно иметь их в виду, особенно, когда вы только начинаете знакомиться с языком. Большинство из них могут быть так же и плюсами языка, в зависимости от точки зрения.
- Clojure работает на JVM
 
- (хотя не только)
 
- Clojure это Lisp
 
- (хотя и не совсем обычный Lisp)
 
- Clojure — язык с динамической типизацией
 
- (хотя есть попытки прикрутить к нему выведение типов, это всё не его)
 
- Изменение объектов в Clojure намеренно усложнено
 
- (но это намеренно!)
 
- Сообщения об ошибка в Clojure часто выглядят очень мутно
 
- (здесь сложно поспорить, хотя есть методы борьбы с этим)
 
Подробнее:
[править] Сферы применения Clojure
[править] Сравнение Clojure с другими языками
[править] clojure vs java
[править] clojure vs python
[править] clojure vs ruby
[править] clojure vs scala
[править] clojure vs erlang
[править] clojure vs haskell
[править] clojure vs common lisp
[править] clojure vs f#
- How does Clojure compare to F#? (англ.)
 
[править] clojure vs racket
[править] Краткая история Clojure
[править] Основы
[править] С чего начать
[править] Почему Clojure?
Один из самых серьезных источников проблем в программах - побочные эффекты (side effects) функций. Конечно, полностью без них нельзя обойтись, но мы можем их локализовать. В этом нам помогает сама природа Clojure, которая стимулирует программиста писать чистые функции.
Другой плюс - это иммутабельность данных, неизменяемость. Особенно приятно, что неизменяемость данных в Clojure не приводит к существенному падению производительности, так как при «изменении» структуры данных старая версия и новая разделяют большую часть внутренних данных (персистентные коллекции).
[править] Установка Clojure
Если вы работаете под Windows, вы можете попробовать начать работу с Clojure с помощью Clojure Box. Это комплект из необходимых инструментов, включающих собственно Clojure, Emacs, SLIME и несколько других полезных вещей, оснащённый инсталлятором и инсталлирующийся и запускающийся в один клик.
- clojure-box (англ.)
 - Clojure Box Download Package (англ.)
 
[править] Запуск программ Clojure из командной строки
Есть два основных способа запуска программ Clojure из командной строки, которые используются в зависимости от того, используется leiningen или нет.
Программу на Clojure можно запустить так (предположим, прогрмма называется program.clj):
$ java -cp clojure.jar clojure.main program.clj
Если код структурирован с помощью файлов и пространств имён (namespaces), то при вызове программы следует указать, какое пространство имён должно использоваться:
Например, в src/foo.clj находится:
    (ns foo)
    (defn -main
        [& args]
        (println args))
Вызов программы осуществляется таким образом:
    $ java -cp clojure.jar:src clojure.main --main foo arg1 arg2 arg3
Если для управления проектом используется Leiningen, подготовка к запуску из командной строки и использованию аргументов командной строки выполняется так.
В описании проекта, в файле project.clj нужно указать значение :main, которое указывает на то, в каком пространстве имён находится стартовая функция -main<tt>:
(defproject cmdline "1.0.0" :description "Command line application in Clojure" :dependencies [[org.clojure/clojure "1.3.0"]] :main cmdline.core )
Потом в файле, соответствующем указанному пространству имён, находящемуся в подготологе каталога <tt>src/ в проекте, в данном случае в src/cmdline/core.clj нужно установить свойство :gen-class в описании пространства имён:
(ns cmdline.core (:require [clojure.java.io :as io]) (:gen-class :main true))
После этого нужно описать функцию -main:
(defn -main "The application's main function" [& args] (println args))
Программу теперь можно выполнять командой
lein run 1 2 3
из каталога проекта. 1 2 3 в данном случае это аргументы командной строки программы.
Можно собрать из проекта uberjar, который использовать потом независимо:
lein uberjar
Использовать:
java -jar cmdline-1.0.0-standalone.jar hello!
Подробнее:
- Building Command Line Applications with Clojure (англ.)
 - Creating Standalone Java Applications with Leiningen (англ.)
 
Для полноценной обработки опций командной строки (короткие, длинные опции, обязательные и необязательные опции, аргументы опций) лучше всего использовать модуль tools.cli 
.
[править] Структуры данных в Clojure
[править] Символ
[править] Ключевое слово
[править] Список
[править] Вектор
К вектору нельзя присоединить значение слева (insert), при выполнении conj значение автоматически добавляется в конец. Если значение обязательно должно быть сначала, то можно сделать
(into [1] [2 3])
но стоимость этой операции не O(1), а O(n).
Естественно, можно использовать concat, но (в большинстве случаев) это ещё хуже, поскольку фактического добавления не происходит, а выполняется только ленивая операция конкатенации (но в простейших случая этого может быть достаточно).
(concat [1] [2 3])
Более обстоятельным решением может быть использование пальцевых деревьев (finger trees),
специальной персистентной структуры данных, которая поддерживает добавление как слева, так и справа.
В Clojure она доступна в виде отдельной библиотеки data.finger-tree 
.
(def dl (double-list 4 5 6 7)) dl ;=> (4 5 6 7) [(first dl) (rest dl)] ;=> [4 (5 6 7)] (conjl dl 'x) ;=> (x 4 5 6 7) [(pop dl) (peek dl)] ;=> [(4 5 6) 7] (conj dl 'x) ;=> (4 5 6 7 x)
Подробнее об этой структуре данных и библиотеке:
- Finger Trees (англ.)
 
[править] Ассоциативный массив
[править] Управление последовательностью исполнения
[править] Функции
[править] Мемоизация
Мемоизация это одна из очень мощных техник, которая используется для автоматического сохранения результатов трудоёмких вычислений функций.
В Clojure эта техника особенно полезна и широкоприменяема, в силу того, что функции, как правило, являются чистыми и легкомемоизируемыми.
В простейшем случае мемоизированный аналог любой чистой функции можно сделать, выполнив:
(defn f1 [a] ; ... )
(def f1* (memoize f1))
Функция f1 уже мемоизирована.
Ситуация немного усложняется при мемоизации рекурсивных функций. Проблема в том, что мемоизированная функция, вызывающаяся рекурсивно, на этапе описания функции ещё не существует (в текущем пространстве имён).
Существует несколько способов решения данной проблемы:
- Передача мемоизированной функции как первого аргумента функции и соответственно вызов её вместо самой себя;
 - Игры с локальными переменными потока (thread local vars).
 
Пример функции Фибоначчи, реализованной вторым способом[3]:
(defn fibo [y]
  (with-local-vars
      [fib (memoize
            (fn [x]
              (if (< x 2)
                y
                (+ (fib (- x 2)) (fib (dec x))))))]
    (.bindRoot fib @fib)
    (@fib y)))
Подробнее о мемоизации в Clojure:
- http://clojuredocs.org/clojure_core/clojure.core/memoize (англ.) — собственно функция memoize
 - Laziness and Memoization in Clojure (англ.)
 - Exploring Clojure Memoization (англ.)
 
Более развитый подход к мемоизации реализован в модуле core.memoize:
[править] Локальная и динамическая область видимости
[править] Работа с последовательностями
Сюда же пока отнесём вот эти темы, хотя, наверное, их лучше выделить в отдельный раздел:
[править] Деструктуризация
[править] Выполнение действий с побочными эффектами
[править] Важные возможности/особенности языка
[править] Последовательности и ленивые вычисления (lazy evaluations)
[править] Рекурсия с помощью loop и recur
[править] Протоколы (defrecord и protocols)
[править] Макросы
[править] Механизмы одновременного исполнения
- Clojure STM - What? Why? How? (англ.)
 - Clojure STM - Ref Consistency (англ.)
 
[править] Ссылки и транзакционная память (references и transcational memory)
[править] Атомы (Atoms)
[править] Агенты (Agents)
[править] Фьючерсы (Futures)
[править] Состояние потока (Thread state)
[править] Метаданные (Metadata)
[править] Мультиметоды (Multimethods)
В языке Clojure нет pattern matching'а, но он есть в дополнительном модуле core.match.
[править] Записи
[править] Интеграция с Java
В Clojure существует несколько различных механизмов интеграции с Java, обладающих различными свойствами и подходящими в различных ситуациях.
Какой именно тип подходит в каждом конкретном случае определяется условиями его использования.
[править] Интеграция с бинарным кодом
Интеграция с бинарным (нативным) кодом осуществляется с использованием тех же механизмов, что традиционно используются в Java:
- JNI,
 - JNA,
 - SWIG.
 
Кроме того в Clojure существует несколько приятных модулей, который делают использование интерфейсов очень простым, даже в некоторых случаях элементарным делом:
Например, с помощью clojure-jna 
:
(require '[net.n01se.clojure-jna :as jna]) (jna/invoke Integer c/printf "My number: %d\n" 5)
Вместо c/ может быть указана любая другая интересующая библиотека. Естественно, она должна быть доступна из JVM:
-Djava.library.path=...
Использование JNA хотя и является очень простым, не всегда подходит. В частности, если необходимо использовать не чистые Си-библиотеки, а C++, то напрямую получить к ним доступ с помощью этих интерфейсов не получится (однако, можно написать Си-враппер).
При использовании SWIG таких проблем нет.
Ещё по теме:
[править] Пространства имён и модули
Ещё по теме:
[править] Работа с исключениями в Clojure
[править] Типизация
[править] Разработка на Clojure
- Clojure, Emacs, nREPL and Leiningen (англ.) очень маленькое, краткое и понятное введение в использовании Clojure, Leiningen и Cider в связке
 
[править] Leiningen
Другая, очень интересная и многообещающая система сборки: Boot. Подробнее:
- http://boot-clj.com/ (англ.) — домашняя страница
 -  https://github.com/boot-clj/boot 
 - http://adzerk.com/blog/2014/11/clojurescript-builds-rebooted/ (англ.) — хорошая вводная статья от автора проекта
 - Boot: Getting Started With Clojure In < 10 Minutes (англ.)
 
[править] REPL
[править] Среда разработки
[править] Emacs + CIDER
В качестве примера полностью интерактивной разработки рассмотрим небольшой пример. В примере разрабатывается простейшее web-приложение (базирующееся на ring и compojure). Изменения в приложении выполняются с помощью REPL (nREPL если быть точным), напрямую, без его остановки и перезагрузки.
Скелет приложения создадим с помощью Leiningen (используя модуль compojure):
lein new compojure hello-world cd hello-world
Затем в код src/handler.clj добавим строчки, которые запускают nrepl-сервер в приложении в момент его старта:
(use '[clojure.tools.nrepl.server :only (start-server stop-server)]) (defonce server (start-server :port 7888))
(используем tools.nrepl 
).
После этого можно запускать приложение:
$ lein ring server 2014-06-13 20:54:35.358:INFO:oejs.Server:jetty-7.6.8.v20121106 2014-06-13 20:54:35.401:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000 Started server on port 3000
Сервер отвечает на HTTP-запросы по порту 3000. Nrepl-сервер доступен на порту 7888.
Для того чтобы подключиться к нему из Emacs нужно запустить nREPL-клиент (CIDER) и подключиться к этому порту.
Стоит отметить, что к nREPL может подключаться не только Emacs, но и ряд других клиентов, в том числе:
- собственно Leiningen;
 - Eclipse (с помощью плагина Counterclockwise (англ.));
 -  Vim (с помощью плагина fireplace.vim 
 );
 -  Reply 
 — более мощный REPL Clojure.
 
Для того чтобы подключиться к удалённому nREPL из Emacs, используя CIDER, нужно выполнить:
M-x cider
и указать параметры подключения.
С этого момента CIDER подключен напрямую к работающему приложению и изменения, которые делаются в нём напрямую отражаются на исполняемом коде.
Для того чтобы убедиться в этом, добавим ещё один маршрут:
   (defroutes app-routes
     (GET "/" [] "Hello World")
     (GET "/1" [] "Hello from page 1")
     (route/resources "/")
     (route/not-found "Not Found"))
Добавленный маршрут:
(GET "/1" [] "Hello from page 1")
После этого, используя комбинацию клавиш c-c c-c, выполним обновлённый defroutes и (def app ...).
Страница /1 отвечает теперь Hello from page 1.
Автопродолжение в Emacs для Clojure (не только для Clojure, но для него в том числе) удобнее всего выполнять при помощи расширения company-mode. Фреймворк поддерживает большое количество различных источников (backend-ов) данных об автопродолжении.
При использовании CIDER достаточно проинсталлировать и активировать модуль company-mode.
Инсталляция:
    M-x list-packages
    # затем выбрать и  company-mode
Активация:
M-x company-mode
Иногда набор кода Clojure может быть существенно ускорен с помощью системы шаблонов Yasnippet для Emacs. Расширения Yasnippet для Clojure:
[править] Vim
[править] Eclipse
[править] IDEA
-  la-clojure 
 — плагин для IntelliJ IDEA для разработки на Clojure
 
[править] XCode
(разве есть?)
[править] Nightcode
- Nightcode (англ.)
 
[править] Тестирование
- speclj (англ.) — тестовый фреймворк для Clojure
 
[править] Качество кода
-  kibit 
 — статический анализатор кода Clojure. Находит места в коде, которые можно было бы написать лучше
 -  eastwood 
 — lint для Clojure; плагин leiningen
 
[править] Логгинг и профайлинг
- Clojure in Production: Logging (англ.)
 
[править] Поддерживаемые платформы
[править] JVM
Собственно основная платформа Clojure.
От JVM Clojure нужно многое, в частности:
- Сборщик мусора;
 - Компилятор;
 
[править] CLR
Clojure на CLR отстаёт от Clojure на Java на некоторое время, на несколько недель обычно.
Первоначально платформа CLR была настолько важна для Clojure, что это отразилось даже в названии языка: название Clojure (CLJ) произошло от букв C (C#), L (Lisp) и J (Java) [4] [5].
ELC 2010: Rich Hickey and Joe Pamer - Perspectives on Clojure and F#] (англ.) интересные диалог на тему перспектив Clojure на платформе CLR
[править] JavaScript
Поддержка платформы JavaScript языком Clojure осуществляется в рамках проекта ClojureScript.
ClojureScript это модификация Clojure (фактически это компилятор Clojure), компилирующаяся в JavaScript.
Подробнее:
Об использовании ClojureScript поверх Node.js (это возможно, но есть нюансы).
- http://dannysu.com/2013/01/14/clojurescript-for-nodejs/ С этого можно начать;
 -  https://github.com/emezeske/lein-cljsbuild 
 Плагин для Leiningen, который помогает очень с работой с ClojureScript;
 - http://gearon.blogspot.de/2013/03/clojurescript-and-nodejs.html Ещё одна неплохая статья на эту тему;
 - http://caffeinatedideas.com/2013/08/15/webapps-with-clojurescript.html небольшое введение в вопрос;
 - http://caffeinatedideas.com/2013/08/29/taming-nodejs-with-clojurescript.html продолжение предыдущей статьи;
 - http://mmcgrana.github.io/2011/09/clojurescript-nodejs.html довольно хорошая, но немного устаревшая статья на тему запуска ClojureScript поверх Node.js.
 
Смысл использования ClojureScript поверх Node.js может быть в нескольких случаях:
- Для многих Web-микроприложений использование JVM это слишком, легковесный Node.js может вполне справиться с необходимой задачей;
 - Нужно быстрое время запуска (проблема использования JVM в том, что даже для маленьких программ требуется большое время запуска);
 - Нужны библиотеки, которые есть только в Node.js;
 - Нужна тесная интеграция с проектом на Node.js.
 
По поводу сравнения производительности Clojure и ClojureScript:
Дополнительная информация:
-  http://himera.herokuapp.com/ (англ.) — компилятор ClojureScript->JavaScript в web
- http://himera.herokuapp.com/synonym.html (англ.) — сравнение конструкций JavaScript и ClojureScript
 
 
[править] LLVM
Пока что Clojure не работает на LLVM. Заставить работать Clojure на LLVM будет непросто, хотя попытки предпринимаются постоянно.
[править] Native
В native-код Clojure напрямую не компилируется, однако Clojure можно скомпилировать в нечто, что потом будет скомпилировано в машинный код. Например, в Scheme.
Проект, который посвящён компиляции Clojure в Gambit Scheme:
-  clojure-scheme 
 - clojure-scheme: Compiling to Native Code via Scheme (англ.) — презентация проекта clojure-scheme
 
Попытка компилировать Clojure в Objective C:
[править] Аспекты применения
[править] Работа с операционной системой
[править] Работа с датой и временем
[править] Работы с файлами
[править] Работа с потоками ввода/вывода
[править] Работа со строками
[править] Работа с различными форматами данных
[править] XML
[править] JSON
[править] YAML
[править] EDN
[править] Лексический анализ, синтактический анализ и регулярные выражения
[править] Работа с базами данных в Clojure
[править] GUI и Clojure
[править] Разработка игр в Clojure
[править] Web
В мире Clojure есть несколько компонентов, которые чаще всего используются для построения web-приложений:
- Ring — аналог WSGI в Python;
 - Compojure — микрофреймворк типа Flask для Python, главный упор на маршрутизацию (routing);
 - Hiccup — HTML-генератор;
 - Enlive — шаблонизатор/генератор HTML, основанный на работе с селекоторами (à la CSS) в HTML-коде; представляет совершенно иной по отношению к традционным движкам HTML-шаблонов подход;
 - Liberator — библиотека, предназначенная для построения REST-серверов и предоставления доступа к данным по HTTP; совместима с Ring.
 
В прошлом был ещё популярен фреймворк Noir, который больше не развивается.
Кроме того, есть ещё более развитый фреймворк Conjure, который можно сравнить с Django или Rails.
REST:
- Building REST APIs for Clojure Web Applications (англ.)
 - A REST API in Clojure (англ.)
 -  What is the good starting point to developing RESTful web service in Clojure? 
 
Безопасность Web-приложений на Clojure:
- Clojure web security is worse than you think (англ.) — интересно обсуждение на y-combinator'е
 
[править] Enlive
-  Enlive 
 - Enlive Getting Started (англ.) — парочка простейших примеров использования Enlive, просто чтобы начать понимать о чём это вообще
 -  Enlive in Clojure Cookbook 
 — рецепт про Enlive из Clojure Cookbook, неплохое введение в тему
 -  Enlive Tutorial 
 — довольно продвинутое введение в Enlive
 - Middleman + Enlive: The best thing since PHP (англ.) — рассуждения на тему как использовать Enlive в сочетании со статическим генератором сайтов
 - Look, Ma! No batteries! A Clojure Web App Without Noir (англ.) — более старая статья на эту же тему, вдохоновившая автора предыдущей статьи; эта статья более подробнее и сложнее предыдущей, хотя исторически они написаны в обратном порядке, лучше сначала читать предыдущую статью, а потом эту
 
[править] ClojureScript
- Основная страница: ClojureScript
 
Как начать:
lein new mies hello-world lein cljsbuild auto hello-world
После этого открыть файл index.html в браузере[6]. Можно экспериментировать.
-  mies 
 — минимальный шаблон ClojureScript
 -  https://github.com/clojure/clojurescript/wiki/Quick-Start 
 — быстрый старт с ClojureScript; показаны несколько полезных команд; показано как использовать ClojureScript совместно с Node.js
 
ClojureScript не компилируется пока самим ClojureScript, но ведутся работы в этом направлении.
[править] Разработка на Clojure под Android
Пока что не идеально, но уже кое что возможно.
Есть нескольсо свободных проектов, которые помогают вести разработку на Clojure под Android:
-  lein-droid 
 — модуль для Leinigen;
 -  neko 
 — Clojure/Android Toolkit;
 
Следует иметь в виду, что Clojure есть Clojure и при всех очевидных плюсах, у разработки на Clojure под Android есть несколько минусов:
- Сравнительно большой рантайм программ Clojure, который замедляет скачку программ, занимает место на устройствах и т.д.;
 - Программы на Clojure получаются обычно немного медленнее программ на Java;
 - Clojure toolchain (см. выше) пока что не суперстабильный, это во многом экспериментальные или хобби-проекты со всеми вытекающими отсюда последствиями.
 
Подробнее об этом:
-  Android App Development with Clojure: An Interactive Tutorial 
 - Clojure on Android (англ.)
 - The Why and How of Clojure on Android (англ.)
 
Блоги:
Александр Якушев, создатель lein-android:
- Clojure on Android (англ.)
 - Clojure Development on Android (англ.), до 2013
 
[править] Математические вычисления в Clojure
[править] BigData, Hadoop и Clojure
- Программирование Hadoop с помощью Clojure (рус.) — небольшое микровведение в вопрос использования Clojure и Hadoop (а точнее пакета clojure-hadoop)
 -  cascalog 
 — библиотека для обработки данных большого объёма с помощью Clojure
 - Cascalog (англ.) — домашний сайт проекта, документация и примеры
 
[править] Высокопроизводительно программирование (high performance programming) в Clojure
[править] Расширенные вопрос одновременного исполнения (Advanced Concurrency Questions)
Материалы по теме:
-  https://github.com/puniverse/pulsar 
 — легковесные потоки, Go-подобные каналы, Erlang-подобные акторы в Clojure (собственно Clojure-враппер для Quasar'а)
 - http://docs.paralleluniverse.co/pulsar/ (англ.) — Введение в Pulsar
 - http://blog.paralleluniverse.co/2014/02/04/littles-law/ (англ.) — собственно зачем нужные легковесные потоки
 - http://blog.paralleluniverse.co/2014/02/06/fibers-threads-strands/ (англ.) — пара слов о легковесных потоках
 - http://blog.paralleluniverse.co/2014/02/20/reactive/ (англ.) — реактивное программирование на Clojure (используя легковесные потоки)
 - Clojure core.async Channels (англ.)
 - Erlang (and Go) in Clojure (and Java) (англ.)
 
Ещё нужно написать обязательно о распределённом состояние (distributed state) в Clojure, которое проще всего делается через avout.
[править] Асинхронное исполнение в Clojure
Зачем нужен core.async?
- Создать возможности для независимых потоков активности (не обязательно, отражающихся на потоки опе5рационной системы), взаимодействующих друг с другом при помощью очередеподобных каналов;
 - При этом необходимо поддерживать как реальные потоки, так и разделяемые потоки пула, а также JS-движки, где вообще нет многопоточности;
 - Использовать технику CSP (Communication Sequential Processes) для взаимодействия элементов программы.
 
Функции/макросы/операции core.async:
- go
 - >!
 - <!
 - >!!
 - <!!
 - alt!
 - alt!!
 - timeout
 
- Clojure core.async Channels, by rich hickey on Jun 28 2013 (англ.)
 - https://github.com/clojure/core.async/tree/master/examples — простейшие примеры использования core.async
 
[править] Редьюсеры и трансдьюсеры
Трансдьюсеры представляют собой удобные комбинируемые механизмы, позволяющие выражать сложные алгоритмические трансформации данных и совместимые с core.async.
Полноценная поддержка трансдьюсеров в Clojure и в core.async осуществляется с августа 2014 года[7].
Интеграция трансдьюсеров выполнена в язык настолько глубоко, что возможны такие конструкции:
- трансдьюсер применения функции:
 
(map f)
- композиция трансдьюсеров:
 
(comp (map inc) (filter even?))
- (и самое интересное, ради чего, можно сказать, всё и затевалось) применение трансдьюсера к каналу:
 
(chan 1 (comp (map inc) (filter even?)))
- Transducers are Coming, Posted by Rich Hickey on August 6 2014 (англ.)
 - Some trivial examples of using Clojure Transducers (англ.)
 - Using core.async and Transducers to upload files from the browser to S3 (англ.) — хороший практический пример использования трансдьюсеров; в примере код используется для организации загрузки данных на хранилище Amazon S3 напрямую из браузера
 
-  "Transducers" by Rich Hickey (англ.) 
 — выступление Рича Хики на Strange Loop 2014, посвящённое трансдьюсерам
 
Про редьюсеры:
[править] Известные алгоритмы на Clojure
[править] Быстрая сортировка (qsort)
[править] Ленивая реализация qsort
[править] Приложения на Clojure
[править] Incanter
- Data Sorcery with Clojure (англ.) — хороший сайт об анализе данных с помощью Incanter/Clojure
 
[править] Overtone
[править] Разное
[править] Конференции
[править] Группы пользователей и известные тусовки
[править] Работа и вакансии
Банковский/финансовый сектор[8]:
- В Citi в кредитном отделе;
 - В UBS в Equity Derivatives Risk and P&L system;
 - В Deutsche Bank[9].
 
Европейские стартапы, использующие Clojure:
- Ardoq.com (англ.), Норвегия — весь бэкенд написан на Clojure
 
[править] Дополнительная информация
- Clojure_Programming/Getting_Started (англ.) — небольшое введение в то, как установить Clojure и начать с ним работать; есть советы по настройке rlwrap
 - PCL -> Clojure (англ.) — куски Practical Common Lisp, переписанные на Clojure; от автора книги Programming Clojure
 -  http://clojuredocs.org/ (англ.) — документация по всем основным функциям и макросам Clojure
- http://clojuredocs.org/quickref/Clojure%20Core (англ.) — описание одной строкой, хорошая стартовая точка для знакомства с языком
 
 - http://clojure.org/cheatsheet — основные функции и макросы Clojure, сведённые в таблицу; ещё одна хорошая стартовая точка
 
Библиотеки:
- https://clojars.org/ (англ.) — Поисковик по библиотекам Clojure
 - http://www.clojure-toolbox.com/ (англ.) — Сборник ссылок на библиотеки на все случаи жизни
 
Задачки:
- https://www.4clojure.com/ (англ.) — сборник задач по Clojure
 - http://clojurekoans.com/ (англ.) — коаны Clojure; задачки-изречения помогающие познать Clojure
 - http://clojurescriptkoans.com/ (англ.) — коаны ClojureScript, работают прямо в браузере
 
Шутки-прибаутки:
- clojure комикс (перевод лисп-комикса на clojure)
 
[править] Неотсортированное
[править] Макрос ->
Развитие идей макросов -> и ->> в проекте swiss-arrows:
[править] Интересные заметки и статьи
- Why we are choosing Clojure as our main programming language (англ.) — беглое сравнение Clojure с другими языками с точки зрения бывшего пользователя Python/Django
 
[править] Прочие информационные источники
[править] Блоги и микроблоги
- http://swannodette.github.io/ прикольный блог по ClojureScript
 
Твиттеры:
[править] Книги
В данный момент (лето 2014) существует несколько книг по Clojure, отличающихся глубиной, стилем изложения и направленностью:
- Seven Languages in Seven Weeks
 - Bruce Tate, 2010, The Pragmatic Programmers, http://pragprog.com/book/btlang/seven-languages-in-seven-weeks
 - В этой книге Clojure посвящена только одна глава.
 
- Programming Clojure
 - Stuart Dabbs Halloway, 2009, The Pragmatic Programmers, http://pragprog.com/book/shcloj2/programming-clojure
 
- Clojure Programming
 - Chas Emerick, Brian Carper, Christophe Grand, 2012, O'Reilly Media, http://shop.oreilly.com/product/0636920013754.do
 
- Clojure CookbookO'Reilly Media
 - Luke VanderHart, Ryan Neufeld, 2014.03, O'Reilly Media, http://shop.oreilly.com/product/0636920029786.do
 -  Книга доступна на github.com 
.
 
- ClojureScript Up and Running
 - Stuart Sierra, Luke VanderHart, O'Reilly Media, http://shop.oreilly.com/product/0636920025139.do
 
- Clojure in Action
 - (Second Edition), Amit Rathore, January 2015, Manning Publications Co., http://www.manning.com/rathore2/
 
- The Joy of Clojure
 - Michael Fogus and Chris Houser, May 2014, Manning Publications Co., http://joyofclojure.com/
 
- Clojure Data Analysis Cookbook
 - Eric Rochester, March 2013, https://www.packtpub.com/big-data-and-business-intelligence/clojure-data-analysis-cookbook
 
- Clojure For Machine Learning
 - Akhil Wali, April 2014, Packt Publishing, https://www.packtpub.com/big-data-and-business-intelligence/clojure-machine-learning
 
- Clojure High Performance Programming
 - Shantanu Kumar, November 2013, Packt Publishing, https://www.packtpub.com/application-development/clojure-high-performance-programming
 
- Mastering Clojure Data Analysis
 - Eric Rochester, May 2014, Packt Publishing, https://www.packtpub.com/big-data-and-business-intelligence/mastering-clojure-data-analysis
 
- Web Development with Clojure. Build Bulletproof Web Apps with Less Code
 - Tomek Lipski, Januray 2014, The Pragmatic Programmers, https://pragprog.com/book/dswdcloj/web-development-with-clojure
 
- Building Web Applications with Clojure
 - Dmitri Sotnikov, April 2014, Packt Publishing, https://www.packtpub.com/web-development/building-web-applications-clojure-video
 
- Mastering Clojure Macros
 - Write Cleaner, Faster, Smarter Code
 - Colin Jones, September 2014, The Pragmatic Programmers, https://pragprog.com/book/cjclojure/mastering-clojure-macros
 
Обзоры книг:
-  Comparing Clojure books 
 — краткий обзор основных книг по Clojure, существующих на сегодняшний день (на 2012 год) (доступно только мощным пользователям SO)
 - Clojure Books list (англ.) — ещё один список книг по Clojure
 
Книги по Clojure в свободном доступе:
- Clojure for the Brave and True (англ.)
 
[править] Видео
[править] Конференции и тусовки
Россия
Украина
- Kiev Clojure Users (рус.), проводилось 3 раза в первой половине 2014
 
Европа
- EuroClojure (англ.)
 - :clojureD (англ.) — конференция в Берлине (видео с 2015)
 - clojuTRE (англ.) — конференция в Тампере, Финляндия
 
Остальной мир (США, Канада, Австралия)
- Clojure/conj (англ.)
 - Clojure/West (англ.)
 - lambdajam (англ.) — различные функциональные языки программирования, не только Clojure
 - Stragne Loop (англ.) — собственно не только Clojure, но тематика близка
 
[править] Примечания
- ↑ http://www.ibm.com/developerworks/ru/library/os-eclipse-clojure/
 - ↑ О том, какие это синтаксические конструкции, можно узнать здесь:
- Clojure - reader (англ.)
 - Learning Clojure/Reader Macros (англ.)
 - Clojure: Read and Eval (англ.)
 
 - ↑ Источник: http://stackoverflow.com/q/3906831/1458569
 - ↑ http://stackoverflow.com/questions/6427128/why-is-clojure-named-clojure
 - ↑ http://groups.google.com/group/clojure/msg/766b75baa7987850
 - ↑ http://swannodette.github.io/2013/10/27/the-essence-of-clojurescript/
 - ↑ http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming
 - ↑ http://www.quora.com/Functional-Programming/What-is-the-next-big-functional-language-that-is-will-be-practical-and-useful
 - ↑ https://skillsmatter.com/meetups/1223-real-world-clojure