Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Clojure@Echo 01 Структуры данных, полиморфизм, ...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Nikita Prokopov
July 10, 2012
Programming
3
290
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
6.3k
Калифорнийский стартап в России @ NSU
tonsky
1
280
Clojure@Codefest 2013
tonsky
14
1.7k
Clojure@NSU 01
tonsky
1
770
Clojure@NSU 00
tonsky
2
960
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
540
Clojure@Echo 00 обзор, concurrency
tonsky
3
490
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
CSC307 Lecture 04
javiergs
PRO
0
660
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
380
Implementation Patterns
denyspoltorak
0
280
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
0
900
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
250
AtCoder Conference 2025
shindannin
0
1k
CSC307 Lecture 01
javiergs
PRO
0
690
Basic Architectures
denyspoltorak
0
660
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
110
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2k
How to build a perfect <img>
jonoalderson
1
4.9k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Site-Speed That Sticks
csswizardry
13
1.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
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