Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
Nikita Prokopov
July 10, 2012
Programming
3
260
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
Структуры данных, полиморфизм, интероп
Nikita Prokopov
July 10, 2012
Tweet
Share
More Decks by Nikita Prokopov
See All by Nikita Prokopov
DataScript for Web Development
tonsky
1
4.8k
Калифорнийский стартап в России @ NSU
tonsky
1
240
Clojure@Codefest 2013
tonsky
14
1.7k
Clojure@NSU 01
tonsky
1
710
Clojure@NSU 00
tonsky
2
920
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
420
Clojure@Echo 00 обзор, concurrency
tonsky
3
430
Юзабилити инструментов разработчика
tonsky
0
160
Other Decks in Programming
See All in Programming
Swift Concurrencyによる安全で快適な非同期処理
tattn
2
330
クリエイティブ系のウェブサイト制作で役立つCSS技法 / CSS for develop creative website
clockmaker
2
1.7k
Android入門
hn410
0
310
「新卒だけ」じゃない!学び直しを支えるミクシィの技術研修を紹介
mixi_engineers
PRO
0
150
偏見と妄想で語るスクリプト言語としての Swift / Swift as a Scripting Language
lovee
2
270
Update from the Elixir team - 2022
whatyouhide
0
200
Explore Java 17 and beyond
josepaumard
3
660
Get Ready for Jakarta EE 10
ivargrimstad
0
2.8k
LegalForceの契約データを脅かすリスクの排除と 開発速度の向上をどうやって両立したか
aibou
0
390
How useEvent would change our applications
koba04
1
1.8k
Kotlin KSP - Intro
taehwandev
1
500
Enterprise Angular: Frontend Moduliths with Nx and Standalone Components @jax2022
manfredsteyer
PRO
0
310
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Fireside Chat
paigeccino
11
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
21
14k
Fantastic passwords and where to find them - at NoRuKo
philnash
25
1.5k
Robots, Beer and Maslow
schacon
152
7.1k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
Why You Should Never Use an ORM
jnunemaker
PRO
47
5.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
151
12k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
29
4.3k
4 Signs Your Business is Dying
shpigford
169
20k
Embracing the Ebb and Flow
colly
73
3.3k
Music & Morning Musume
bryan
35
4.1k
Transcript
Echo // Ульяновск, 2012 # Clojure@Echo 01 clojure.org
Echo // Ульяновск, 2012 # Числа Long 1 Ratio 1/3
Double 1.0 BigInt 36786883868216818816N BigDecimal 3.14159265358M
Echo // Ульяновск, 2012 # Числа ## Операции Нормальное равенство:
(== 1 1.0) => true Проверка на переполнение: + - * / quot rem Авто-promoting: +’ -’ *’ inc’ dec’ Без проверок: unchecked-add…
Echo // Ульяновск, 2012 # Строки и символы java.lang.String “abc”
java.lang.Character \a \b \c
Echo // Ульяновск, 2012 # Keywords (:abc mymap) <=> (mymap
:abc) <=> (get mymap :abc) (:abc mymap 0) <=> (mymap :abc 0) <=> (get mymap :abc 0)
Echo // Ульяновск, 2012 # Коллекции + Иммутабельны + Персистентны
+ Шарят структуру + Гарантии по скорости + Interop в Джаву (как родные) + Абстрактные (count, conj, seq)
Echo // Ульяновск, 2012 # ISeq + Делается из любой
коллекции + Даже из Java arrays и Iterables + Могут быть ленивыми
Echo // Ульяновск, 2012 # ISeq ## Применения first rest
cons
Echo // Ульяновск, 2012 # ISeq ## Применения-2 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-
Echo // Ульяновск, 2012 # Списки ‘(a b c) <=>
(list a b c) Быстрое добавление в начало Остальное медленно :)
Echo // Ульяновск, 2012 # Векторы [a b c] <=>
(vector 1 2 3) ([a b c] 0) <=> (get [a b c] 0) + Дерево с коэфф. ветвления 32 + Доступ по индексу O(log 32 N) + Быстрое добавление в конец + rseq
Echo // Ульяновск, 2012 # Словари (maps) {:a 1, :b
2} ({…} :a) <=> (get {…} :a) ({…} :a 0) <=> (get {…} :a 0) + Bit-partitioned hash tries + Поиск O(log 32 N) (hash-map) или O(log N) (sorted-map)
Echo // Ульяновск, 2012 # Словари (maps) ## Реализация
Echo // Ульяновск, 2012 # Словари (maps) ## Шаринг структуры
Echo // Ульяновск, 2012 # Множества #{a b c} <=>
(hash-set a b c) (#{1 2 3} 1) <=> (get #{1 2 3} 1) ==> 1 (#{1 2 3} 4) <=> (get #{1 2 3} 4) ==> nil
Echo // Ульяновск, 2012 # Мультиметоды dispath function + cases
(defmulti area (fn [shape] (get shape :type))) ;; (defmulti area :type)
Echo // Ульяновск, 2012 # Мультиметоды (defmethod area :square [this]
(* (:side this) (:side this))) (defmethod area :circle [this] (* Math/PI (:radius this) (:radius this))) (area {:type :circle, :radius 10}) (area {:type :square, :side 2})
Echo // Ульяновск, 2012 # Мультиметоды ## Диспатчинг по типу
(defmulti foo class) (defmethod foo java.lang.String [s] (format “%s” s)) (defmethod foo java.lang.Integer [i] (format “%i” i)) (defmethod foo nil [_] “nothing here”) (defmethod foo :default [_] :oops)
Echo // Ульяновск, 2012 # Протоколы Диспатчинг по типу первого
аргумента Быстрые Не создают иерархий и отношений Расширяются в любой момент
Echo // Ульяновск, 2012 # Протоколы ## Пример (defprotocol Pr
(foo [x]) (bar [x y])) (defrecord Foo [a b c] Pr (foo [x] a) (bar [x y] (+ c y)))
Echo // Ульяновск, 2012 # Протоколы ## Пример-2 (extend-protocol Pr
String (foo [x] ...) IPersistenVector (foo [x] ...) (bar [x y] ...) nil (bar [x y] ...) Object (bar [x y] ...))
Echo // Ульяновск, 2012 # Протоколы ## Пример-3 (extend-type Foo
Countable (cnt [c] ...) Pr (foo [x] ...) (bar [x y] …))
Echo // Ульяновск, 2012 # Интероп (new Date) <==> (Date.)
obj.method(args) <==> (.method obj args) (.toUpperCase “fred”) (.-prop obj) (set! (.-prop obj) v) (System/getProperty “java.vm.version”) Math/PI
Echo // Ульяновск, 2012 # Интероп ## Расширяем Джаву (proxy
MouseListener [] (onMouseClick [e] …) (onMouseOver [e] …)) (reify Object (toString [this] f))
Echo // Ульяновск, 2012 # Интероп ## Type hints (set!
*warn-on-reflection* true) (defn len [^String x] (.length x)) (defn hinted (^String [] “a“))
Echo // Ульяновск, 2012 # Интероп ## Примитивы (int …),
(float …), … aget, aset, int-array, ints… amap, areduce ^ints, ^floats, …
Echo // Ульяновск, 2012 Никита Прокопов tonsky.livejournal.com Echo, Ульяновск 12
июля 2012 aboutecho.com echorussia.ru Обсуждение лекций: tonsky.livejournal.com/tag/clojure