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.2k
Калифорнийский стартап в России @ NSU
tonsky
1
270
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
530
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
tonsky
3
290
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
API Platform 4.2: Redefining API Development
soyuka
0
220
私の後悔をAWS DMSで解決した話
hiramax
4
210
🔨 小さなビルドシステムを作る
momeemt
4
690
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
Flutter with Dart MCP: All You Need - 박제창 2025 I/O Extended Busan
itsmedreamwalker
0
150
旅行プランAIエージェント開発の裏側
ippo012
2
930
AIでLINEスタンプを作ってみた
eycjur
1
230
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
400
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
190
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
260
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
460
Swift Updates - Learn Languages 2025
koher
2
510
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
Context Engineering - Making Every Token Count
addyosmani
3
62
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
How to train your dragon (web standard)
notwaldorf
96
6.2k
The World Runs on Bad Software
bkeepers
PRO
70
11k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
Git: the NoSQL Database
bkeepers
PRO
431
66k
A better future with KSS
kneath
239
17k
We Have a Design System, Now What?
morganepeng
53
7.8k
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