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