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
460
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
5.6k
Калифорнийский стартап в России @ NSU
tonsky
1
250
Clojure@Codefest 2013
tonsky
14
1.7k
Clojure@NSU 01
tonsky
1
730
Clojure@NSU 00
tonsky
2
940
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
450
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
tonsky
3
270
Юзабилити инструментов разработчика
tonsky
0
170
Other Decks in Programming
See All in Programming
SwiftUI, Jetpack Composeの導入で変化した「家族アルバム みてね」のアプリ開発体験
hicka04
6
400
9年開発を牽引して見えてきた、共通化すべきものと個別でつくるもの ~プログラム言語~
shinout
1
280
フロントエンドパフォーマンス 入門
shouta2
7
1.5k
Building a Smaller App Binary
kateinoigakukun
2
220
Migrating to Signals: A Practical Workshop
manfredsteyer
PRO
0
290
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
840
設計の知識と技能で駆動するソフトウェア開発
masuda220
PRO
18
11k
チームでモデリングを育てるうえで 考えたこと・気づいたこと / Cultivating Modeling in Teams: Thoughts and Insights
mackey0225
5
2.4k
Deno に Web 標準 API を実装する / Implementing Web Standard API to Deno
petamoriken
0
350
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
2
470
生成 AI の中身を覗いてみよう〜基礎から医療現場での応用まで〜
soh9834
2
770
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
330
Featured
See All Featured
Faster Mobile Websites
deanohume
296
30k
Building a Modern Day E-commerce SEO Strategy
aleyda
15
6.3k
Art, The Web, and Tiny UX
lynnandtonic
288
19k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
225
51k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
319
20k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
11
1.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
397
65k
Optimising Largest Contentful Paint
csswizardry
7
2.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
From Idea to $5000 a Month in 5 Months
shpigford
376
45k
Why You Should Never Use an ORM
jnunemaker
PRO
50
8.6k
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