Clojure@NSU 00

Clojure@NSU 00

4188c62c28a196e3e82363217c56fca5?s=128

Nikita Prokopov

March 06, 2013
Tweet

Transcript

  1. # mainstreamless ## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта

    2013
  2. # Причины создания clojure.org/rationale Развитая платформа ЛИСП Функциональное программирование Concurrency

  3. # JVM Быстрая Качественная Уровенем выше ОС, лучше абстракции Валом

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

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

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

    recur throw try monitor-enter monitor-exit . new set!
  7. # LISP REPL Открытость — всё управляемо Даже синтаксис!

  8. # ФП Удобный инструмент First-class functions Lexical closures Ленивость Dynamic

    typing
  9. # Как это выглядит 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; } }
  10. # Как это выглядит (defn blank? [s] (every? #(Character/isWhitespace %)

    s))
  11. # Как это выглядит 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))
  12. # Синтаксис 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”})
  13. # Синтаксис (defn f [x y] (+ x y)) [1

    2 3] (1 2 3) {:x 1 :y 2} #{:x :y :z}
  14. # Философия См. youtube.com/clojuretv Особенно (!) Rich Hickey

  15. # Открывайте данные Программы перемалывают данные Не прячьте их “It

    is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.”
  16. # Открывайте данные 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-
  17. # Decomplecting Var = value + time Object = state

    + identity + value Method = func + state + namespace Actors = what + who Loops = what + how ...
  18. # Открытость Мультиметоды, протоколы Метаданные Predicate dispatch вместо pattern matching

    Composable abstractions $().click().css() или (-> ($ ...) (click ) (css))
  19. # Переиспользуемость Неймспейсится всё Нет custom reader, есть EDN Полиморфизм

    через протоколы
  20. # Комбинируемость Avoid things that do not compose Manual locking

    Imperative code
  21. # Concurrency ## Задача колония муравьев собирает пищу каждый муравей

    — отдельный поток общая карта еды рисовать положение дел
  22. # Concurrency ## Задача

  23. # Concurrency ## Проблемы неатомарные операции согласованное принятие решений когерентное

    состояние мира
  24. # Проблемы многопоточного программирования «Мир» постоянно меняется Просадка скорости на

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

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

    памяти Быстрые (почти константная стоимость) Портированы в Scala :)
  27. # List 1 2 3 list1 head tail list2 head

    tail list3 head tail
  28. # Vector v

  29. # Vector v

  30. # Vector v

  31. # Vector v

  32. # Vector v

  33. # Vector v

  34. # Vector v ... ...

  35. # Vector v ... ... up to 32 elms log

    32 (size)
  36. # Vector v ... ... up to 32 elms log

    32 (size) 00[00000][00000][00000][00000][00001][00100]
  37. # Map ## Hash trie

  38. # Map

  39. # 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...
  40. # Atoms 1 x

  41. # Atoms 1 2 x (f 1)

  42. # Atoms 1 2 x swap!

  43. # Atoms 1 2 x

  44. # Atoms 1 2 3 x (f 2)

  45. # Atoms 1 2 3 x swap!

  46. # Atoms 1 2 3 x

  47. # Atoms 1 2 3 x @x

  48. # Atoms 1 2 3 x (f (f 1)) @x

  49. # Atoms Для «простого» mutable state Явно выделенная «мутация» Атомарное

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

    −2
  51. 1 2 3 x (f −2) −2 −1 # Atoms

    ## Конфликты
  52. 1 2 3 x swap! −2 −1 # Atoms ##

    Конфликты
  53. # 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>
  54. # Agent 2 g f h thread pool

  55. # Agent 2 h g f thread pool

  56. # Agent 2 h g thread pool f

  57. # Agent 2 h g thread pool f (f 2)

  58. # Agent 3 h g thread pool (f 2)

  59. # Agent 3 h g thread pool

  60. # Agent 3 h thread pool g

  61. # Agent Unit of work Похож на atoms, только… Для

    последовательных операций: heavy lifting, сохранение в файл, запись в сеть, конечные автоматы, … Выполняется в отдельном потоке Очередь сообщений Всегда наблюдаемое состояние
  62. # STM Согласованное изменение состояния Проще рассуждать Сложнее ошибиться Composable

    Агенты работают с STM!
  63. # STM

  64. # Concurrency Иммутабельность Персистентные структуры данных Software transactional memory Lock-free

    Composable Безопасно!
  65. # mainstreamless ## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта

    2013