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 00 обзор, concurrency
Search
Nikita Prokopov
July 01, 2012
Programming
3
490
Clojure@Echo 00 обзор, concurrency
Видео
http://tonsky.livejournal.com/265218.html
Nikita Prokopov
July 01, 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 01 Структуры данных, полиморфизм, интероп
tonsky
3
290
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.8k
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
200
Fragmented Architectures
denyspoltorak
0
150
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
160
Basic Architectures
denyspoltorak
0
660
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
950
Oxlintはいいぞ
yug1224
5
1.3k
Architectural Extensions
denyspoltorak
0
270
CSC307 Lecture 03
javiergs
PRO
1
490
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
150
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
990
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
130
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
170
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
110
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
79
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1k
Writing Fast Ruby
sferik
630
62k
Paper Plane
katiecoart
PRO
0
46k
Marketing to machines
jonoalderson
1
4.6k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
140
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Transcript
Echo // Ульяновск, 2012 # Clojure ЛИСП Функциональное программирование Развитая
платформа Concurrency
Echo // Ульяновск, 2012 # Clojure ## ЛИСП Маленькое ядро
Почти нет синтаксиса Код-как-данные
Echo // Ульяновск, 2012 # Clojure ## ФП First-class functions
Lexical closures Ленивость Dynamic typing
Echo // Ульяновск, 2012 # Clojure ## JVM Быстрая Качественная
Уровенем выше ОС, лучше абстракции Валом библиотек Валом инструментов
Echo // Ульяновск, 2012 # Clojure ## Concurrency Иммутабельность Персистентные
структуры данных Software transactional memory Lock-free
Echo // Ульяновск, 2012 # Особенности ## Многоплатформенность Маленькое ядро
Мало синтаксиса ↓ + JVM + .NET + JavaScript + Python + …?
Echo // Ульяновск, 2012 # Особенности ## Interop Уважает платформу
Писать джаву на кложе проще, чем на джаве clj strings = java strings clj numbers = java numbers clj nil = java null
Echo // Ульяновск, 2012 # Особенности ## Перпендикулярность
Echo // Ульяновск, 2012 # Особенности ## Перпендикулярность-2 State =
value + time OOP = functions + data
Echo // Ульяновск, 2012 # Особенности ## Перпендикулярность-3
Echo // Ульяновск, 2012 # Особенности ## Превозносит данные Программы
перемалывают данные Классы это тюрьма для данных Стандартные структуры с богатой семантикой
Echo // Ульяновск, 2012 # Особенности ## Превозносит данные “It
is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.” - Alan J. Perlis
Echo // Ульяновск, 2012 # Особенности ## Открытость Мультиметоды, протоколы
Метаданные Predicate dispatch вместо pattern matching Composable abstractions $().click().css() или (-> ($ ) (click ) (css))
Echo // Ульяновск, 2012 # Особенности ## Открытость-2 Управление всем
Vars, namespaces, загрузка кода — всё программируется Дебаггер с брекпоинтами уместился в одну главу книги
Echo // Ульяновск, 2012 # Особенности ## Открытость-3 Compilation pipeline
Compiler-as-a-service Как будто собираешь свой маленький компьютер
Echo // Ульяновск, 2012 # Особенности ## Макросы Все то,
о чем мы так долго мечтали
Echo // Ульяновск, 2012 # Особенности ## Переиспользуемость Нет custom
reader есть reader literals though Неймспейсится всё
Echo // Ульяновск, 2012 # Особенности ## Динамичность Новое для
JVM REPL Компиляция в байткод на лету
Echo // Ульяновск, 2012 # Основы ## Как это выглядит
“string” :keyword ‘(\L \i \s \t) [:V :e :c :t :o :r] #{“S” “e” “t”} {:key value, :key2 value2} \C #”[Rr]egexp?”
Echo // Ульяновск, 2012 # Основы ## А в видеоверсии
— сделал #inst ”2012-06-26T11:00:00.00+04:00” java.util.Date #uuid “uuid-string” java.util.UUID
Echo // Ульяновск, 2012 # Основы ## Как это выглядит-2
(ns echo.clojure-u.lecture1 (:use clojure.java.io [clojure.string :only [replace]])) (def x 10) (defn hello [arg & args] (println “Hello, “ arg))
Echo // Ульяновск, 2012 # Основы ## Как это выглядит
— всё вместе (condp some [1 2 3 4] #{0 6 7} :>> inc #{4 5 9} :>> dec #{1 2 3} :>> #(+ % 3))
Echo // Ульяновск, 2012 # Основы ## Что вообще происходит?
(some #{0 6 7} [1 2 3 4]) ↳(or (#{0 6 7} 1) ; nil (#{0 6 7} 2) ; nil (#{0 6 7} 3) ; nil (#{0 6 7} 4)) ; nil ==> nil (some #{4 5 9} [1 2 3 4]) ↳(or (#{4 5 9} 1) ; nil ... ; nil (#{4 5 9} 4) ; 4 ==> 4 :>> (dec 4) ==> 3
Echo // Ульяновск, 2012 # Основы ## Destructuring (let [kv
… [k v] kv]) (let [{k :k, v :v} m]) (let [{:keys [k v]} m])
Echo // Ульяновск, 2012 # Основы ## Функции (fn [x
y] (+ x y)) #(+ %1 %2) #(+ % %)
Echo // Ульяновск, 2012 # Основы ## Функции-2 (def f
(fn [x y] (+ x y))) (defn f [x y] (+ x y)) (defn f ([x] …) ([x y] …))
Echo // Ульяновск, 2012 # Основы ## Функции-3 (defn constrained-sqr
[x] {:doc “Documentation” :pre [(pos? x)] :post [(> % 16), (< % 225)]} (* x x))
Echo // Ульяновск, 2012 # Основы ## Concurrency — vars
Хранят значения «глобальных» функций и переменных, то, что хранится в namespace. Thread-local rebind (binding)
Echo // Ульяновск, 2012 # Основы ## Concurrency — vars
Create/modify: (def x 1) (def ^:dynamic *debug* false) (binding [*debug* true] …) Read value: x *debug* Read var ref itself: #’x
Echo // Ульяновск, 2012 # Основы ## Concurrency — atoms
Modify by applying a func Not coordinated Create: (def a (atom {})) Modify: (swap! a assoc :x 1) (reset! a {:x 2}) Read: @a
Echo // Ульяновск, 2012 # Основы ## Concurrency — refs
Modify by applying a func Coordinated Accessible/modifiable inside (dosync) only
Echo // Ульяновск, 2012 # Основы ## Concurrency — refs
Create: (def a (ref {})) Modify: (dosync (alter a assoc :x 1) (ref-set a {:x 2})) Read: (dosync @a)
Echo // Ульяновск, 2012 # Основы ## Concurrency — agents
Modify by “sending” a func Will be applied in a different thread Coordinated with STM Always available to read
Echo // Ульяновск, 2012 # Основы ## Concurrency — agents
Create: (def a (agent {})) Modify: (dosync (send a assoc :x 1) (send-off a {:x 2})) Read: @a
Echo // Ульяновск, 2012 # Основы ## Concurrency — delivering
results (let [f (future (do …))] @f) (let [p (promise)] (future (deliver p :res)) @p)
Echo // Ульяновск, 2012 Никита Прокопов tonsky.livejournal.com Echo, Ульяновск 26
июня 2012 aboutecho.com echorussia.ru Обсуждение лекции: tonsky.livejournal.com/265121.html