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
480
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.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 01 Структуры данных, полиморфизм, интероп
tonsky
3
290
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
生成AIで日々のエラー調査を進めたい
yuyaabo
0
630
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
160
ktr0731/go-mcpでMCPサーバー作ってみた
takak2166
0
170
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
13
2.9k
Blazing Fast UI Development with Compose Hot Reload (droidcon New York 2025)
zsmb
1
150
Effect の双対、Coeffect
yukikurage
5
1.4k
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
150
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
320
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
1
420
Team topologies and the microservice architecture: a synergistic relationship
cer
PRO
0
960
GoのGenericsによるslice操作との付き合い方
syumai
3
680
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
750
Featured
See All Featured
BBQ
matthewcrist
89
9.7k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
How STYLIGHT went responsive
nonsquared
100
5.6k
Fireside Chat
paigeccino
37
3.5k
Optimizing for Happiness
mojombo
379
70k
Rails Girls Zürich Keynote
gr2m
94
14k
KATA
mclloyd
29
14k
How GitHub (no longer) Works
holman
314
140k
4 Signs Your Business is Dying
shpigford
184
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
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