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@NSU 01
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Nikita Prokopov
March 20, 2013
Programming
790
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Clojure@NSU 01
Nikita Prokopov
March 20, 2013
More Decks by Nikita Prokopov
See All by Nikita Prokopov
DataScript for Web Development
tonsky
1
6.5k
Калифорнийский стартап в России @ NSU
tonsky
1
280
Clojure@Codefest 2013
tonsky
14
1.8k
Clojure@NSU 00
tonsky
2
980
Clojure@Echo 02 Библиотеки, web-стек, ClojureScript
tonsky
3
550
Clojure@Echo 01 Структуры данных, полиморфизм, интероп
tonsky
3
310
Clojure@Echo 00 обзор, concurrency
tonsky
3
500
Юзабилити инструментов разработчика
tonsky
0
190
Other Decks in Programming
See All in Programming
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
690
dRuby over BLE
makicamel
2
340
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
230
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
140
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
200
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
240
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
250
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
260
Featured
See All Featured
Believing is Seeing
oripsolob
1
150
Designing for Timeless Needs
cassininazir
1
260
WENDY [Excerpt]
tessaabrams
11
38k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Producing Creativity
orderedlist
PRO
348
40k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Transcript
# mainstreamless ## Clojure 01 Никита Прокопов tonsky.livejournal.com 20 марта
2013
# Clojure web stack Servlet Netty Mongrel2 Http-kit Aleph Ring
Moustache Compojure Enlive Hiccup Laser ClojureScript Domina Enfocus Crate Javelin Reflex
# Ring Server ←→ app contract fn [request-map] → response-map
Похоже на WSGi (Python) github.com/ring-clojure/ring/blob/master/SPEC
# Ring { :uri :query-string :request-method :headers :body ... }
→ { :status :headers :body }
# Ring Нет реализации — нет зависимостей, багов, етц Маленькая
— легко реализовать Низкоуровневая Вход-выход — просто тестировать Веб-сокеты не засунешь
# Middleware (fn [handler ...] → handler’) ring.middleware: + Sessions
+ Cookies + Uploads + Form parsing ...
# Диспатчинг ## Moustache (def my-app (app [“hi”] {:get “hello
world only for GET!”} [“hi” name] {:get [“hello “ name]}))
# Диспатчинг ## Compojure (defroutes app (GET “/” [] “<h1>Hello
World</h1>”) (route/not-found “<h1>Page not found</h1>”))
# Templating — цветочки ## Hiccup (html [:span {:class “foo”}
“bar”]) <span class=”foo”>bar</span> (html [:div#foo.bar.baz “bang”]) <div id=”foo” class=”bar baz”>bang</div>
# Templating — цветочки ## Hiccup (defn with-cdn [cdn-url form]
(clojure.walk/postwalk (fn [node] (if (rel-asset-path? node) (cdn-url node) node) form)))
# Templating — ягодки ## Enlive Парсинг и трансформация HTML
Код отдельно от верстки Переиспользование snippets Модификации можно комбинировать Макросы!
# Templating — ягодки ## Enlive (at a-node [:a :selector]
a-transformation [:another :selector] another-transformation ...) (html/deftemplate index “tutorial/template1.html” [ctxt] [:p#message] (html/content (get ctxt :message “Nothing to see here”))
# Templating — ягодки ## Laser Еще более функциональный (laser/document
(laser/parse html) (laser/class= “meow”) (laser/content “omg”))
# Aleph Сетевая библиотека Общение через каналы Conforms to Ring,
только request и response разделены HTTP, WebSockets, TCP, UDP, Redis
# Aleph async (defn handler [response-channel request] (enqueue response-channel {:status
200 :headers {“content-type” “text/plain”} :body “Hello World”}))
# Aleph async (def handler (app [“sync”] {:get “response”} [“async”]
{:get (wrap-aleph-handler async-han- dler)})) (start-http-server (wrap-ring-handler handler) {:port 8080})
# Aleph async (def broadcast-channel (channel)) (defn chat-handler [ch handshake]
(receive ch (fn [name] (siphon (map* #(str name “: “ %) ch) broadcast-channel) (siphon broadcast-channel ch)))) (start-http-server chat-handler {:port 8080 :websocket true})
# http-kit Pure Java & Clojure, very small Server &
client Ring-compliant Websockets, long-polling, streaming extensions
# edn Data exchange format Based on Clojure syntax Rich
set of elements collections, symbols, keywords Extensible for new types Self-describing (no schema) Namespaces
# edn { :created_at #inst “1985-04-12T23:20:50.52Z” :id 209722238071619586 :id_str “209722238071619586”
:retweeted false :text “tweet” :com.google.maps/geo nil :entries { :user_mentions [ { :id 1001 :indices [0 16] :name “Petrov” } ] } }
# edn clojure.core/read-string clojure.edn/read-string (since 1.5)
# edn clojure.core/read-string clojure.edn/read-string (since 1.5) and cljs.reader/read-string
# ClojureScript
# Lessons learned from Node.js Писать клиент и сервер на
одном языке очень удобно! Только почему на JavaScript?
# ClojureScript JS is broken
# ClojureScript JS is fundamentally broken
# ClojureScript JS is fundamentally broken Синтаксические изменения не спасут
Нужно править семантику
# Что сломано? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые
операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
# CoffeeScript? Типы Структуры данных Зависимости Неймспейсы Полиморфизм Типовые операции
Меньше кнопок нажимать
# Как правильно? Состояние Иммутабельность ФП Макросы Строгая типизация Протоколы
# Как правильно? Стандартные решения для стандартных проблем
# Как правильно? Стандартные решения для стандартных проблем Реализаций import:
0 ООП-фреймворков: 0 Альтерн. синтаксисов: 0 Альтерн. коллекций: 0 Monad tutorials: 0
# Как работает? Компилируется на большой Clojure Генерирует Javascript для
Google Closure Compiler Оптимизируется Google Closure Compiler Зависимости через Goolge Closure Library
Notice Clojure (Rich Hickey) and Closure (Google)
# Компиляция? Dead code elimination Smart code compression Снимает browser
quirks Может увеличить производительность Debug :(
# Отличия от Clojure Однопоточный Compilation и macroexpansion только на
Clojure (no eval) Browser-connected REPL Native JS regexes
# Отличия от Clojure Atoms, but no Refs nor STM
No Vars No agents No symbol or var (def) metadata
# Отличия от Clojure (.foo o) => o.foo() (.-foo o)
=> o.foo
# Персистентные структуры данных Native JS impl http://www.50ply.com/cljs-bench/ 2-6 times
slower than JVM Google Chrome usually ×3-5 times faster than Safari / FF
# Персистентные структуры данных
# Персистентные структуры данных
# Зачем? Разработка больших приложений Организация кода Командная работа Переиспользуемость
кода Производительность, оптимизация
# Библиотеки No problem Нужен extern файл /** * @param
{(string|Object.<string,*>)} arg1 * @param {Object.<string,*>=} settings * @return {jQuery.jqXHR} */ jQuery.ajax = function(arg1, settings) {};
# Библиотеки ## jQuery $(“element“) .appen(“xyz”) .attr(“data-weight”, 70) .css(“left”, 156
+ “px”); (-> (js/$ “#element“) (.append “xyz“) (.attr “data-weight“ 70) (.css “left“ (str 156 “px”))
# Библиотеки ## jayq (def $interface (jq/$ :#interface)) (-> $interface
(jq/css {:background “blue”}) (jq/inner “Loading!”))
# DOM manipulation Domina Enfocus Crate Webfui Dommy
# DOM manipulation Domina ~ jQuery Enfocus ~ Enlive Crate
~ Hiccup Webfui ~ DOM isolation Dommy ~ Efficient macro-compile
# FRP javelin reflex shafty
# FRP ## Javelin (defn ^:export start [] (let [text
(form-cell “#text”) length (cell (count text))] (.focus (by-id “#text”)) (cell (html! “#count” “Length: %s” length))))
# CLJS on Node.js Faster startup times Native clients (node-webkit)
# Usecases ## Lighttable
# Usecases ## Prismatic
# Usecases ## Weathertable
# mainstreamless ## Clojure 01 Никита Прокопов tonsky.livejournal.com 20 марта
2013