Xgu.ru теперь в Контакте  — приходите и подключайтесь.
Пока мы работаем над следующими видео, вы можете подключиться в Контакте. Познакомимся и обсудим новые страницы и ролики.

Vk-big.pngYoutube-big.jpeg

Clojure

Материал из Xgu.ru

Перейти к: навигация, поиск
Clojure-logo.png

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

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

Clojure работает на JVM
(хотя не только)
Clojure это Lisp
(хотя и не совсем обычный Lisp)
Clojure — язык с динамической типизацией
(хотя есть попытки прикрутить к нему выведение типов, это всё не его)
Изменение объектов в Clojure намеренно усложнено
(но это намеренно!)
Сообщения об ошибка в Clojure часто выглядят очень мутно
(здесь сложно поспорить, хотя есть методы борьбы с этим)

Подробнее:

[править] Сферы применения 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#

[править] clojure vs racket

[править] Краткая история Clojure

[править] Основы

[править] С чего начать

Эти темы не раскрыты:

  • Основы Clojure
  • что такое clojure
  • clojure что это
  • clojure для чайников
  • почему clojure
  • clojure ооп
  • clojure язык программирования
  • clojure для начинающих
  • clojure getting started
  • clojure hello world
  • clojure язык программирования
  • clojure синтаксис
  • clojure example
  • clojure примеры
  • clojure по русски
  • clojure programming
  • clojure comment
  • clojure doc
  • clojure eval
  • компиляция clojure
  • clojure уроки

[править] Почему Clojure?

Один из самых серьезных источников проблем в программах - побочные эффекты (side effects) функций. Конечно, полностью без них нельзя обойтись, но мы можем их локализовать. В этом нам помогает сама природа Clojure, которая стимулирует программиста писать чистые функции.

Другой плюс - это иммутабельность данных, неизменяемость. Особенно приятно, что неизменяемость данных в Clojure не приводит к существенному падению производительности, так как при «изменении» структуры данных старая версия и новая разделяют большую часть внутренних данных (персистентные коллекции).

[править] Установка Clojure

Эти темы не раскрыты:

  • Как скачать/установить
  • Под Linux и под Windows
  • Можно ли использовать прямо из веб-браузера без всяких установок
  • Clojure Box
  • Небольшое введение в Leiningen

Если вы работаете под Windows, вы можете попробовать начать работу с Clojure с помощью Clojure Box. Это комплект из необходимых инструментов, включающих собственно Clojure, Emacs, SLIME и несколько других полезных вещей, оснащённый инсталлятором и инсталлирующийся и запускающийся в один клик.

[править] Запуск программ 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!

Подробнее:

Для полноценной обработки опций командной строки (короткие, длинные опции, обязательные и необязательные опции, аргументы опций) лучше всего использовать модуль tools.cli Github.png.

[править] Структуры данных в Clojure

Эти темы не раскрыты:

  • Базовые типы данных: числа, строки, булевые значения, регулярные выражения, символы, ключевые слова
  • Списки
  • Векторы
  • Ассоциативные массивы
  • Множества
  • Функции

[править] Символ

Эти темы не раскрыты:

  • symbol
  • symbol?
  • quote
  • quoting
  • unquote

[править] Ключевое слово

Эти темы не раскрыты:

  • keyword to string
  • keyword
  • keyword parameters
  • keyword vs symbol

[править] Список

[править] Вектор

Эти темы не раскрыты:

  • vector
  • nth

К вектору нельзя присоединить значение слева (insert), при выполнении conj значение автоматически добавляется в конец. Если значение обязательно должно быть сначала, то можно сделать

 (into [1] [2 3])

но стоимость этой операции не O(1), а O(n).

Естественно, можно использовать concat, но (в большинстве случаев) это ещё хуже, поскольку фактического добавления не происходит, а выполняется только ленивая операция конкатенации (но в простейших случая этого может быть достаточно).

 (concat [1] [2 3])

Более обстоятельным решением может быть использование пальцевых деревьев (finger trees), специальной персистентной структуры данных, которая поддерживает добавление как слева, так и справа. В Clojure она доступна в виде отдельной библиотеки data.finger-tree Github.png.

(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)

Подробнее об этой структуре данных и библиотеке:

[править] Ассоциативный массив

Эти темы не раскрыты:

  • assoc
  • assoc-in
  • update-in
  • merge
  • hashmap
  • dissoc
  • keys
  • update map


[править] Управление последовательностью исполнения

Эти темы не раскрыты:

  • when
  • cond
  • if
  • if-let
  • case

[править] Функции

Эти темы не раскрыты:

  • Функция как first-class-citizen
  • Основные операции над функциями (comp, juxt, complement и тд)
  • Применений функций к последовательностям (map, reduce, filter и тд)
  • anonymous function
  • defn
  • fn
  • letfn
  • apply
  • named arguments
  • optional parameter
  • optional params
  • optional arguments
  • juxt
  • comp
  • partial
  • memoize

[править] Мемоизация

Мемоизация это одна из очень мощных техник, которая используется для автоматического сохранения результатов трудоёмких вычислений функций.

В 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:

Более развитый подход к мемоизации реализован в модуле core.memoize:

[править] Локальная и динамическая область видимости

Эти темы не раскрыты:

  • clojure let
  • clojure binding

[править] Работа с последовательностями

Эти темы не раскрыты:

Сюда же пока отнесём вот эти темы, хотя, наверное, их лучше выделить в отдельный раздел:

Эти темы не раскрыты: Работа с рекурсией/замена рекурсии:

  • clojure хвостовая рекурсия
  • clojure хвостовая рекурсия
  • clojure recur
  • clojure loop

Работа с циклами/замена циклов:

  • clojure циклы

Преобразование последовательностей:

  • clojure map
  • clojure mapcat
  • clojure for
  • clojure reduce
  • clojure iterate
  • clojure filter
  • clojure remove

Эти темы не раскрыты:

  • into
  • empty
  • vector to map
  • vector to list
  • byte array to string
  • bytes to string

[править] Деструктуризация

Эти темы не раскрыты:

  • destructuring
  • деструктуризация
  • unpack list

[править] Выполнение действий с побочными эффектами

Эти темы не раскрыты:

  • doseq
  • doall
  • foreach (в clojure нет foreach, но есть doseq)

[править] Важные возможности/особенности языка

[править] Последовательности и ленивые вычисления (lazy evaluations)

Эти темы не раскрыты:

  • clojure lazy-seq

[править] Рекурсия с помощью loop и recur

Эти темы не раскрыты:

  • В Clojure нет tail call optimization, и не будет пока она не появится в JVM. Что же есть вместо этого?

[править] Протоколы (defrecord и protocols)

[править] Макросы

Эти темы не раскрыты:

  • defmacro
  • clojure macros
  • clojure макросы
  • clojure dsl
  • книга "clojure for domain-specific languages"

[править] Механизмы одновременного исполнения

Изменение частоты процессоров со временем. Начиная с 2005 частота процессоров больше практически не растёт, компенсируя это количеством ядер

Эти темы не раскрыты:

  • Многозадачность и параллелизм
  • Расписать подробно в чём принципиальная разница между concurrency и parallelism'ом (обязательно найти правильный русский перевод этих терминов)
  • agent
  • future
  • многопоточность
  • потоки
  • atom
  • delay
  • clojure quasar
  • clojure swap


[править] Ссылки и транзакционная память (references и transcational memory)

[править] Атомы (Atoms)

[править] Агенты (Agents)

[править] Фьючерсы (Futures)

[править] Состояние потока (Thread state)

[править] Метаданные (Metadata)

[править] Мультиметоды (Multimethods)

Эти темы не раскрыты:

  • Мультиметоды
  • defmulti

В языке Clojure нет pattern matching'а, но он есть в дополнительном модуле core.match.

Эти темы не раскрыты:

  • core.match
  • clojure pattern matching

[править] Записи

Эти темы не раскрыты:

  • clojure defrecord

[править] Интеграция с Java

В Clojure существует несколько различных механизмов интеграции с Java, обладающих различными свойствами и подходящими в различных ситуациях.

Какой именно тип подходит в каждом конкретном случае определяется условиями его использования.

Эти темы не раскрыты:

  • clojure java
  • Java Interop
  • doto
  • Протоколы прокси и так далее
  • protocols
  • proxy
  • reify
  • gen-class

[править] Интеграция с бинарным кодом

Интеграция с бинарным (нативным) кодом осуществляется с использованием тех же механизмов, что традиционно используются в Java:

  • JNI,
  • JNA,
  • SWIG.

Кроме того в Clojure существует несколько приятных модулей, который делают использование интерфейсов очень простым, даже в некоторых случаях элементарным делом:

Например, с помощью clojure-jna Github.png:

 (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 таких проблем нет.


Эти темы не раскрыты: SWIG

Ещё по теме:

[править] Пространства имён и модули

Эти темы не раскрыты: Модули, библиотеки, пространства-имён

  • clojure ns
  • clojure import
  • clojure use
  • clojure require
  • clojure namespace
  • clojure contrib

Ещё по теме:

[править] Работа с исключениями в Clojure

Эти темы не раскрыты:

  • clojure try catch
  • clojure exceptions
  • clojure backtrace

[править] Типизация

Эти темы не раскрыты:

  • clojure type hints (на эту тему: [1])
  • clojure typed

[править] Разработка на Clojure

  • Clojure, Emacs, nREPL and Leiningen (англ.) очень маленькое, краткое и понятное введение в использовании Clojure, Leiningen и Cider в связке

[править] Leiningen

Эти темы не раскрыты:

  • что это за штука такая, leiningen
  • как происходит управление зависимостями
  • что такое проект в leiningen
  • lein try
  • lein repl
  • создание проекта с различными скелетами

Другая, очень интересная и многообещающая система сборки: Boot. Подробнее:

[править] REPL

[править] Среда разработки

Эти темы не раскрыты:

  • Сравнение различных IDE Clojure и их особенностей


[править] 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 Github.png).

После этого можно запускать приложение:

   $ 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 Github.png );
  • Reply Github.png — более мощный 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.

Использования company-mode с CIDER

Автопродолжение в 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 Github.png — плагин для IntelliJ IDEA для разработки на Clojure

[править] XCode

(разве есть?)

[править] Nightcode

[править] Тестирование

Эти темы не раскрыты:

  • Тестирование кода Clojure
  • Использование BDD для разработки программ Clojure (clojure bdd)
  • speclj (англ.) — тестовый фреймворк для Clojure

[править] Качество кода

Эти темы не раскрыты:

  • Улучшение качества кода с помощью kibit.
  • Улучшение качества кода с помощью eastwood.
  • kibit Github.png — статический анализатор кода Clojure. Находит места в коде, которые можно было бы написать лучше
  • eastwood Github.png — lint для Clojure; плагин leiningen

[править] Логгинг и профайлинг

Эти темы не раскрыты:

  • timbre
  • clojure performance
  • clojure logging
  • производительность программ на clojure
  • stm-profiler Stackoverflow.png

[править] Поддерживаемые платформы

[править] JVM

Собственно основная платформа Clojure.

От 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 (это возможно, но есть нюансы).

Смысл использования ClojureScript поверх Node.js может быть в нескольких случаях:

  • Для многих Web-микроприложений использование JVM это слишком, легковесный Node.js может вполне справиться с необходимой задачей;
  • Нужно быстрое время запуска (проблема использования JVM в том, что даже для маленьких программ требуется большое время запуска);
  • Нужны библиотеки, которые есть только в Node.js;
  • Нужна тесная интеграция с проектом на Node.js.

По поводу сравнения производительности Clojure и ClojureScript:

Дополнительная информация:

Эти темы не раскрыты:

  • clojure js
  • closure javascript

[править] LLVM

Пока что Clojure не работает на LLVM. Заставить работать Clojure на LLVM будет непросто, хотя попытки предпринимаются постоянно.

[править] Native

В native-код Clojure напрямую не компилируется, однако Clojure можно скомпилировать в нечто, что потом будет скомпилировано в машинный код. Например, в Scheme.

Проект, который посвящён компиляции Clojure в Gambit Scheme:

Попытка компилировать Clojure в Objective C:

[править] Аспекты применения

[править] Работа с операционной системой

Эти темы не раскрыты:

  • работа с процессами
  • работа с переменными окружения

[править] Работа с датой и временем

Эти темы не раскрыты:

  • работа с датой
  • работа со временем
  • временные интервалы
  • clojure time

[править] Работы с файлами

Эти темы не раскрыты:

  • with-open
  • write to file
  • read file
  • random access file

[править] Работа с потоками ввода/вывода

Эти темы не раскрыты:

  • print
  • pprint
  • как перекрыть поток
  • как считать данные со стандартного потока ввода

[править] Работа со строками

Эти темы не раскрыты:

  • clojure string
  • clojure regex
  • clojure split
  • clojure substring
  • clojure unicode character
  • clojure uppercase
  • clojure format
  • регулярные выражения
  • методы Java для работы со строками


[править] Работа с различными форматами данных

[править] XML

Эти темы не раскрыты:

  • Работа с XML в Clojure
  • xslt
  • xml-seq
  • xml parser
  • xml rpc
  • xml
  • xml parse

[править] JSON

Эти темы не раскрыты:

  • clojure json
  • clojure json parse

[править] YAML

[править] EDN

[править] Лексический анализ, синтактический анализ и регулярные выражения

Эти темы не раскрыты:

[править] Работа с базами данных в Clojure

Эти темы не раскрыты:

  • jdbc
  • sql
  • mysql
  • orm
  • korma
  • yesql
  • mongodb

[править] GUI и Clojure

Эти темы не раскрыты:

  • gui
  • qt
  • swing
  • javafx
  • opengl

[править] Разработка игр в Clojure

Эти темы не раскрыты:

  • Разработка игр на Clojure
  • clojure game development
  • clojure game engine

[править] 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:

Безопасность Web-приложений на Clojure:

Эти темы не раскрыты: Темы, которые пока не раскрыты, и которые надо раскрыть:

  • clojure pedestal
  • clojure framework
  • clojure web framework
  • clojure ring
  • сайт на clojure
  • clojure hiccup
  • clojure http
  • clojure http client
  • clojure http kit
  • clojure html parser
  • clojure enlive
  • clojure noir
  • clojure websocket
  • clojure web framework
  • clojure web
  • clojure om
  • clojure parse html
  • clojure template engine
  • clojure url
  • clojure oauth

[править] Enlive

  • Enlive Github.png
  • Enlive Getting Started (англ.) — парочка простейших примеров использования Enlive, просто чтобы начать понимать о чём это вообще
  • Enlive in Clojure Cookbook Github.png — рецепт про Enlive из Clojure Cookbook, неплохое введение в тему
  • Enlive Tutorial Github.png — довольно продвинутое введение в 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 Github.png — минимальный шаблон ClojureScript
  • https://github.com/clojure/clojurescript/wiki/Quick-Start Github.png — быстрый старт с ClojureScript; показаны несколько полезных команд; показано как использовать ClojureScript совместно с Node.js

ClojureScript не компилируется пока самим ClojureScript, но ведутся работы в этом направлении.

[править] Разработка на Clojure под Android

Эти темы не раскрыты:

  • clojure для ios
  • clojure для android

Пока что не идеально, но уже кое что возможно.

Есть нескольсо свободных проектов, которые помогают вести разработку на Clojure под Android:

  • lein-droid Github.png — модуль для Leinigen;
  • neko Github.png — Clojure/Android Toolkit;

Следует иметь в виду, что Clojure есть Clojure и при всех очевидных плюсах, у разработки на Clojure под Android есть несколько минусов:

  • Сравнительно большой рантайм программ Clojure, который замедляет скачку программ, занимает место на устройствах и т.д.;
  • Программы на Clojure получаются обычно немного медленнее программ на Java;
  • Clojure toolchain (см. выше) пока что не суперстабильный, это во многом экспериментальные или хобби-проекты со всеми вытекающими отсюда последствиями.

Подробнее об этом:

Блоги:

Александр Якушев, создатель lein-android:


[править] Математические вычисления в Clojure

Эти темы не раскрыты:

  • clojure math
  • incanter

[править] BigData, Hadoop и Clojure

  • Программирование Hadoop с помощью Clojure (рус.) — небольшое микровведение в вопрос использования Clojure и Hadoop (а точнее пакета clojure-hadoop)
  • cascalog Github.png — библиотека для обработки данных большого объёма с помощью Clojure
  • Cascalog (англ.) — домашний сайт проекта, документация и примеры


Эти темы не раскрыты:

  • clojure kafka
  • cascalog

[править] Высокопроизводительно программирование (high performance programming) в Clojure

[править] Расширенные вопрос одновременного исполнения (Advanced Concurrency Questions)

Эти темы не раскрыты:

  • Лёгковесные нити JVM, Quasar и Pulsar

Материалы по теме:

Ещё нужно написать обязательно о распределённом состояние (distributed state) в Clojure, которое проще всего делается через avout.


[править] Асинхронное исполнение в Clojure

Эти темы не раскрыты:

  • Асинхронное и реактивное программирование в Clojure
  • core.async
  • clojure xmpp
  • clojure xmpp client
  • clojure zeromq

Зачем нужен core.async?

  • Создать возможности для независимых потоков активности (не обязательно, отражающихся на потоки опе5рационной системы), взаимодействующих друг с другом при помощью очередеподобных каналов;
  • При этом необходимо поддерживать как реальные потоки, так и разделяемые потоки пула, а также JS-движки, где вообще нет многопоточности;
  • Использовать технику CSP (Communication Sequential Processes) для взаимодействия элементов программы.

Функции/макросы/операции core.async:

go
>!
<!
>!!
<!!
alt!
alt!!
timeout

[править] Редьюсеры и трансдьюсеры

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

Полноценная поддержка трансдьюсеров в Clojure и в core.async осуществляется с августа 2014 года[7].

Интеграция трансдьюсеров выполнена в язык настолько глубоко, что возможны такие конструкции:

  • трансдьюсер применения функции:
   (map f)
  • композиция трансдьюсеров:
   (comp (map inc) (filter even?))
  • (и самое интересное, ради чего, можно сказать, всё и затевалось) применение трансдьюсера к каналу:
   (chan 1 (comp (map inc) (filter even?)))
   
  • "Transducers" by Rich Hickey (англ.) Youtube.jpeg — выступление Рича Хики на Strange Loop 2014, посвящённое трансдьюсерам

Про редьюсеры:

[править] Известные алгоритмы на Clojure

[править] Быстрая сортировка (qsort)

[править] Ленивая реализация qsort

[править] Приложения на Clojure

Эти темы не раскрыты: Известные приложения на Clojure. Особенности их использования.

[править] Incanter

  • Data Sorcery with Clojure (англ.) — хороший сайт об анализе данных с помощью Incanter/Clojure

[править] Overtone

[править] Разное

[править] Конференции

Эти темы не раскрыты:

  • Известные конференции по Clojure в США, Европе и России/Украине/Белоруссии

[править] Группы пользователей и известные тусовки

[править] Работа и вакансии

Эти темы не раскрыты:

  • Популярность на indeed
  • Популярность на Google Trends
  • Индекс популярности языков
  • Где поискать удалённую работу по Clojure
  • Где поискать работу по Clojure в США
  • Где поискать работу по Clojure в Великобритании/Ирландии
  • Где поискать работу по Clojure в Европе (Германия/Голландия)
  • Где поискать удалённую работу по Clojure
  • Работа по Clojure в России
  • Работа по Clojure на Украине

Банковский/финансовый сектор[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://clojure.org/cheatsheet — основные функции и макросы Clojure, сведённые в таблицу; ещё одна хорошая стартовая точка

Библиотеки:

Задачки:

Шутки-прибаутки:

  • clojure комикс (перевод лисп-комикса на clojure)

[править] Неотсортированное

[править] Макрос ->

Развитие идей макросов -> и ->> в проекте swiss-arrows:

[править] Интересные заметки и статьи

[править] Прочие информационные источники

Эти темы не раскрыты:

  • google group clojure
  • irc clojure
  • известные clojure-конференции
  • интересные курсы по clojure, offline и online

[править] Блоги и микроблоги

Эти темы не раскрыты:

  • Блоги известных разработчиков и энтузиастов Clojure
  • Твиттеры известных разработчиков и энтузиастов Clojure
  • Лента Quora на тему Clojure
  • Лента SO на тему Clojure
  • Лента Хабрахабра на тему Clojure
  • clojure by
  • clojure фми

Твиттеры:

[править] Книги

Мировой запас книг по Clojure на 2014 (кроме книг Practical Clojure и Web Development with Clojure)

В данный момент (лето 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 Github.png.
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 Stackoverflow.png — краткий обзор основных книг по Clojure, существующих на сегодняшний день (на 2012 год) (доступно только мощным пользователям SO)
  • Clojure Books list (англ.) — ещё один список книг по Clojure

Книги по Clojure в свободном доступе:

Эти темы не раскрыты:

  • clojure учебник
  • программирование в clojure купить
  • программирование в clojure
  • программирование в clojure pdf
  • программирование в clojure
  • программирование на clojure pdf
  • программирование в clojure скачать
  • программирование в clojure купить
  • программирование clojure
  • programming clojure скачать
  • программирование в clojure скачать
  • joy of clojure скачать
  • clojure книга на русском
  • clojure книга на русском
  • clojure книга
  • clojure книга на русском
  • clojure book
  • clojure in action
  • clojure programming pdf
  • clojure high performance programming pdf

[править] Видео

Эти темы не раскрыты:

[править] Конференции и тусовки

Россия

Украина

  • Kiev Clojure Users (рус.), проводилось 3 раза в первой половине 2014

Европа

Остальной мир (США, Канада, Австралия)

  • Clojure/conj (англ.)
  • Clojure/West (англ.)
  • lambdajam (англ.) — различные функциональные языки программирования, не только Clojure
  • Stragne Loop (англ.) — собственно не только Clojure, но тематика близка

[править] Примечания

Источник — «http://xgu.ru/wiki/Clojure»