🟢 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.