🟢 Clojure
Lisp на JVM: данные и функции, неизменяемые коллекции, REPL.
Шпаргалки · Программирование · #clojure #jvm #lisp
IDE и запуск
IntelliJ + Cursive, VS Code + Calva, Emacs + CIDER. REPL-разработка: код выполняется по формам. Инструменты: clj / deps.edn, Leiningen (lein repl, lein run).
Типы данных
42 3.14 1/3 "строка" \c true nil
:keyword 'symbol
[1 2 3] ; вектор
'(1 2 3) ; список
{:a 1 :b 2} ; map
#{1 2 3} ; set
Все коллекции неизменяемы.
Операторы и вызов
Префиксная запись: (+ 1 2), (> 3 2), (and a b), (or a b), (not x), (= a b), (if cond a b), (cond ...), (case x ...).
Циклы
Явных циклов нет: функции над последовательностями и loop/recur.
(doseq [x [1 2 3]] (println x))
(for [x (range 5) :when (odd? x)] (* x x))
(loop [i 0] (when (< i 3) (println i) (recur (inc i))))
Функции
(defn add [a b] (+ a b))
(def sq (fn [x] (* x x)))
(map #(* % 2) [1 2 3]) ; сокращённая лямбда
(-> [1 2 3] (conj 4) count) ; thread-first
(->> (range 10) (filter even?) (map inc))
Встроенные
map, filter, reduce, first, rest, conj, assoc, dissoc, get, get-in, update, count, str, println, range, take, apply, partial.
Состояние и асинхронность
(def a (atom 0)) (swap! a inc) @a
(future (+ 1 2)) @(future 42)
(let [ch (clojure.core.async/chan)] ...) ; core.async
Ссылки: atom (независимое), ref (транзакции, STM), agent (асинхронное).
Коллекции
(assoc {:a 1} :b 2) (update {:a 1} :a inc) (conj [1 2] 3)
(group-by even? [1 2 3 4]) (sort-by :age people)
Библиотеки по задачам
Ring, Compojure, Reitit (веб), next.jdbc, HoneySQL (БД), Malli, spec (валидация), core.async, Reagent / re-frame (ClojureScript UI), clojure.test.