Введение в Clojure (Никита Прокопов)

548 views
383 views

Published on

http://bit.ly/2mainstream

Никита Прокопов из AboutEcho.com рассказывает о Clojure, 6 марта 2013

Эта лекция — часть курса «Немейнстримовые технологии разработки», читаемого в Новосибирском Государственном Университете

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
548
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Введение в Clojure (Никита Прокопов)

  1. 1. # mainstreamless## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта 2013
  2. 2. # Причины создания clojure.org/rationale Развитая платформа ЛИСП Функциональное программирование Concurrency
  3. 3. # JVM Быстрая Качественная Уровенем выше ОС, лучше абстракции Валом библиотек Валом инструментов
  4. 4. # JVM Уважает платформу Писать джаву на кложе проще, чем на джаве clj strings == java strings clj numbers == java numbers clj nil == java null
  5. 5. # LISP Гибкий Динамичный — новое для JVM Маленькое ядро → портируемость Почти нет синтаксиса Код-как-данные
  6. 6. # LISP def if do let quote var fn loop recur throw try monitor-enter monitor-exit . new set!
  7. 7. # LISP REPL Открытость — всё управляемо Даже синтаксис!
  8. 8. # ФП Удобный инструмент First-class functions Lexical closures Ленивость Dynamic typing
  9. 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. 10. # Как это выглядит (defn blank? [s] (every? #(Character/isWhitespace %) s))
  11. 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. 12. # Синтаксис method() (f) method(arg) (f arg) object.method(arg) (f object arg), (.method o a) Map<String, String> map = (def map {:key “value”}) new HashMap<String, String>(); map.put(“key”, “value”);
  13. 13. # Синтаксис (defn f [x y] (+ x y)) [1 2 3] (1 2 3) {:x 1 :y 2} #{:x :y :z}
  14. 14. # Философия См. youtube.com/clojuretv Особенно (!) Rich Hickey
  15. 15. # Открывайте данные Программы перемалывают данные Не прячьте их “It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.”
  16. 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. 17. # Decomplecting Var = value + time Object = state + identity + value Method = func + state + namespace Actors = what + who Loops = what + how ...
  18. 18. # Открытость Мультиметоды, протоколы Метаданные Predicate dispatch вместо pattern matching Composable abstractions $().click().css() или (-> ($ ...) (click ) (css))
  19. 19. # Переиспользуемость Неймспейсится всё Нет custom reader, есть EDN Полиморфизм через протоколы
  20. 20. # Комбинируемость Avoid things that do not compose Manual locking Imperative code
  21. 21. # Concurrency## Задача колония муравьев собирает пищу каждый муравей — отдельный поток общая карта еды рисовать положение дел
  22. 22. # Concurrency## Задача
  23. 23. # Concurrency## Проблемы неатомарные операции согласованное принятие решений когерентное состояние мира
  24. 24. # Проблемы многопоточного программирования «Мир» постоянно меняется Просадка скорости на syncs Dead locks Live locks Легко ошибиться Сложно просчитать варианты Сложно тестировать
  25. 25. # Immutable data structures Легко шарить между потоками Операции атомарны по определению Едят кучу памяти (медленно?)
  26. 26. # Persistent data structures «Умно» делят общие части Едят мало памяти Быстрые (почти константная стоимость) Портированы в Scala :)
  27. 27. # List list3 list2 list1 head head head tail tail tail 1 2 3
  28. 28. # Vector v
  29. 29. # Vector v
  30. 30. # Vector v
  31. 31. # Vector v
  32. 32. # Vector v
  33. 33. # Vector v
  34. 34. # Vector v ... ...
  35. 35. # Vector vlog32(size) ... ... up to 32 elms
  36. 36. # Vector 00[00000][00000][00000][00000][00001][00100] vlog32(size) ... ... up to 32 elms
  37. 37. # Map## Hash trie
  38. 38. # Map
  39. 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. 40. # Atoms x 1
  41. 41. # Atoms x 1 2 (f 1)
  42. 42. # Atoms x 1 swap! 2
  43. 43. # Atoms x 1 2
  44. 44. # Atoms x 1 2 3 (f 2)
  45. 45. # Atoms x 1 2 ap! 3 sw
  46. 46. # Atoms x 1 2 3
  47. 47. # Atoms x @x 1 2 3
  48. 48. # Atoms x @x 1 2 3 (f (f 1))
  49. 49. # Atoms Для «простого» mutable state Явно выделенная «мутация» Атомарное изменение Любое значение — это всегда результат последовательного применения функций
  50. 50. # Atoms## Конфликты x 1 2 3 (f 2) −2
  51. 51. # Atoms## Конфликты x 1 2 3 −2 −1 (f −2)
  52. 52. # Atoms## Конфликты x 1 2 3 −2 sw ap! −1
  53. 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. 54. # Agent h g f 2 thread pool
  55. 55. # Agent h g f 2 thread pool
  56. 56. # Agent h g 2 f thread pool
  57. 57. # Agent h g 2 f (f 2) thread pool
  58. 58. # Agent h g 3 (f 2) thread pool
  59. 59. # Agent h g 3 thread pool
  60. 60. # Agent h 3 g thread pool
  61. 61. # Agent Unit of work Похож на atoms, только… Для последовательных операций: heavy lifting, сохранение в файл, запись в сеть, конечные автоматы, … Выполняется в отдельном потоке Очередь сообщений Всегда наблюдаемое состояние
  62. 62. # STM Согласованное изменение состояния Проще рассуждать Сложнее ошибиться Composable Агенты работают с STM!
  63. 63. # STM
  64. 64. # Concurrency Иммутабельность Персистентные структуры данных Software transactional memory Lock-free Composable Безопасно!
  65. 65. # mainstreamless## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта 2013

×