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
470
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
6k
Калифорнийский стартап в России @ NSU
tonsky
1
270
Clojure@Codefest 2013
tonsky
14
1.7k
Clojure@NSU 01
tonsky
1
760
Clojure@NSU 00
tonsky
2
950
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
530
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
tonsky
3
280
Юзабилити инструментов разработчика
tonsky
0
180
Other Decks in Programming
See All in Programming
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
9
2.2k
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
0
180
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
120
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
37
14k
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.3k
チームリードになって変わったこと
isaka1022
0
200
GoとPHPのインターフェイスの違い
shimabox
2
190
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
130
クリーンアーキテクチャから見る依存の向きの大切さ
shimabox
2
380
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Speed Design
sergeychernyshev
27
790
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
How STYLIGHT went responsive
nonsquared
98
5.4k
Practical Orchestrator
shlominoach
186
10k
Faster Mobile Websites
deanohume
306
31k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
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