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
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.1k
Калифорнийский стартап в России @ NSU
tonsky
1
270
Clojure@Codefest 2013
tonsky
14
1.7k
Clojure@NSU 01
tonsky
1
770
Clojure@NSU 00
tonsky
2
950
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
530
Clojure@Echo 00 обзор, concurrency
tonsky
3
480
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
210
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
4
850
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
770
KotlinConf 2025 現地で感じたServer-Side Kotlin
n_takehata
1
220
つよそうにふるまい、つよい成果を出すのなら、つよいのかもしれない
irof
1
300
Result型で“失敗”を型にするPHPコードの書き方
kajitack
4
120
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
750
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
150
ktr0731/go-mcpでMCPサーバー作ってみた
takak2166
0
170
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
17
4.8k
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
570
Datadog RUM 本番導入までの道
shinter61
1
310
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building an army of robots
kneath
306
45k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
BBQ
matthewcrist
89
9.7k
How GitHub (no longer) Works
holman
314
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Raft: Consensus for Rubyists
vanstee
140
7k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
790
Designing for Performance
lara
609
69k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
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