Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clojure@NSU 00

Clojure@NSU 00

Nikita Prokopov

March 06, 2013
Tweet

More Decks by Nikita Prokopov

Other Decks in Programming

Transcript

  1. # JVM Уважает платформу Писать джаву на кложе проще, чем

    на джаве clj strings == java strings clj numbers == java numbers clj nil == java null
  2. # LISP Гибкий Динамичный — новое для JVM Маленькое ядро

    → портируемость Почти нет синтаксиса Код-как-данные
  3. # LISP def if do let quote var fn loop

    recur throw try monitor-enter monitor-exit . new set!
  4. # Как это выглядит public class StringUtils { public static

    boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } }
  5. # Как это выглядит public class StringUtils { public static

    boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } } (defn blank? [s] (every? #(Character/isWhitespace %) s))
  6. # Синтаксис method() method(arg) object.method(arg) Map<String, String> map = new

    HashMap<String, String>(); map.put(“key”, “value”); (f) (f arg) (f object arg), (.method o a) (def map {:key “value”})
  7. # Синтаксис (defn f [x y] (+ x y)) [1

    2 3] (1 2 3) {:x 1 :y 2} #{:x :y :z}
  8. # Открывайте данные Программы перемалывают данные Не прячьте их “It

    is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.”
  9. # Открывайте данные distinct filter remove for keep keep-indexed cons

    concat lazy-cat mapcat cycle interleave interpose rest next fnext nnext drop drop-while nthnext for take take-nth take-while butlast drop-last for flat- ten reverse sort sort-by shuffle split-at split-with partition partition-all partition-by map pmap mapcat for replace reductions map-indexed seque first ffirst nfirst second nth when-first last rand-nth zipmap into reduce set vec into-array to-array-2d frequen- cies group-by apply not-empty some reduce seq? eve- ry? not-every? not-any? empty? some filter doseq do- run doall realized? seq vals keys rseq subseq rsubseq lazy-seq repeatedly iterate repeat range line-seq resultset-seq re-seq tree-seq file-seq xml-seq itera-
  10. # Decomplecting Var = value + time Object = state

    + identity + value Method = func + state + namespace Actors = what + who Loops = what + how ...
  11. # Concurrency ## Задача колония муравьев собирает пищу каждый муравей

    — отдельный поток общая карта еды рисовать положение дел
  12. # Проблемы многопоточного программирования «Мир» постоянно меняется Просадка скорости на

    syncs Dead locks Live locks Легко ошибиться Сложно просчитать варианты Сложно тестировать
  13. # Immutable data structures Легко шарить между потоками Операции атомарны

    по определению Едят кучу памяти (медленно?)
  14. # Persistent data structures «Умно» делят общие части Едят мало

    памяти Быстрые (почти константная стоимость) Портированы в Scala :)
  15. # Vector v ... ... up to 32 elms log

    32 (size) 00[00000][00000][00000][00000][00001][00100]
  16. # Atoms (def x (atom 1)) ;; #’user/x (swap! x

    inc) ;; 2 (swap! x inc) ;; 3 (swap! x inc) ;; 10 (?) (swap! x #(Math/sin %)) ;; -0.544...
  17. # Atoms Для «простого» mutable state Явно выделенная «мутация» Атомарное

    изменение Любое значение — это всегда результат последовательного применения функций
  18. 1 2 3 x (f −2) −2 −1 # Atoms

    ## Конфликты
  19. # Agents (def x (agent 1)) ;; #’user/x (send x

    inc) ;; #<Agent@73703457: 2> (send x inc) ;; #<Agent@73703457: 3> (send x (fn [a] (Thread/sleep 1000) (inc a))) ;; #<Agent@73703457: 3> @x ;; #<Agent@73703457: 3> @x ;; #<Agent@73703457: 4>
  20. # Agent Unit of work Похож на atoms, только… Для

    последовательных операций: heavy lifting, сохранение в файл, запись в сеть, конечные автоматы, … Выполняется в отдельном потоке Очередь сообщений Всегда наблюдаемое состояние