On Github alwx / slides-clojure-elegion
Alexandr Pantyuhov / alexandr.pantyuhov@e-legion.com
Последовательности
(def list '(1 2 3 4 5)) -> #'user/list (def vect [1 2 3 4 5]) -> #'user/vect (def hmap {:a 1 :b 2}) -> #'user/hmap (first list) -> 1 (rest list) -> (2 3 4 5) (drop 2 [1 2 3 4 5]) -> (3 4 5) (take 9 (cycle [1 2 3 4])) -> (1 2 3 4 1 2 3 4 1) (interleave [:a :b :c] [1 2 3]) -> (:a 1 :b 2 :c 3) (keys hmap) -> (:a :b)
Lazy
(take 10 (filter even? (iterate inc 0))) -> (0 2 4 6 8 10 12 14 16 18)
High order functions
(map inc [1 2 3 4]) -> (2 3 4 5) (reduce + [1 2 3 4 5]) -> 15 (filter even? '(1 2 3)) -> (2)
Структуры
(defstruct person :name :age :sex) -> #'user/person (def p (struct person "Alexander" 22 "male")) -> #'user/p (:name p) -> "Alexander"
Изменение ссылок на неизменяемые данные в рамках транзакций (больше: http://clojure.org/refs)
(def counters (ref {})) (defn add-counter [key val] (dosync (alter counters assoc key val))) (defn increment-counter [key] (dosync (alter counters assoc key (inc (@counters key 0)))))
user> @counters {} user> (dosync (add-counter :a 1) (add-counter :b 2)) user> @counters {:a 2, :b 1} user> (dosync (increment-counter :a) (increment-counter :b)) user> @counters {:a 2, :b 3}
Похожи на ref, но только обновление данных может происходить в любой момент в зависимости от количества заданий. Задания выполняются в отдельном пуле потоков выполнения, размер этого пула ограничен (больше: http://clojure.org/agents)
В пространство имен импортируются классы из java.lang
(def m (String. "Hello")) -> #'user/m (.toUpperCase m) -> "HELLO" (. m toUpperCase) (Math/sin 1) -> 0.8414709848078965 (. Math sin 1) (.. System getProperties (get "os.name"))
(def hmap (java.util.HashMap.)) -> #'user/hmap (. n put "a" 1) -> nil n -> {"a" 1} (. n equals {"a" 1}) -> true
(http://cemerick.com/2011/07/11/results-of-the-2011-state-of-clojure-survey/)