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 & ClojureScript
Search
Stefan Kanev
May 28, 2015
Programming
2
110
Clojure & ClojureScript
A presentation at I.T.A.K.E. 2015
Stefan Kanev
May 28, 2015
Tweet
Share
More Decks by Stefan Kanev
See All by Stefan Kanev
Въведение в (Machine|Deep) Learning
skanev
0
81
GraphQL
skanev
0
390
Automated Testing: Getting it Right
skanev
1
51
From Novice to Expert
skanev
0
420
Inbetween Code and Profession
skanev
0
420
Extreme Programming
skanev
0
670
За смъртта на TDD
skanev
0
540
Python 0 2014
skanev
1
1.7k
Clojure 0 2014
skanev
0
370
Other Decks in Programming
See All in Programming
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
840
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
1.2k
AtCoder Heuristic First-step Vol.1 講義スライド(山登り法・焼きなまし法編)
takumi152
4
1k
RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ
iberianpig
0
1.1k
Java 24まとめ / Java 24 summary
kishida
3
370
SLI/SLOの設定を進めるその前に アラート品質の改善に取り組んだ話
tanden
3
790
The Weight of Data: Rethinking Cloud-Native Systems for the Age of AI
hollycummins
0
240
私の愛したLaravel 〜レールを超えたその先へ〜
kentaroutakeda
12
3.8k
WordPress Playground for Developers
iambherulal
0
130
snacks.nvim内のセットアップ不要なプラグインを紹介 / introduce_snacks_nvim
uhooi
0
380
Going Structural with Named Tuples
bishabosha
0
190
これだけは知っておきたいクラス設計の基礎知識 version 2
masuda220
PRO
23
5.2k
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
8
720
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Navigating Team Friction
lara
184
15k
Agile that works and the tools we love
rasmusluckow
328
21k
Designing for Performance
lara
606
69k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Statistics for Hackers
jakevdp
798
220k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Bash Introduction
62gerente
611
210k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
22
2.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
118
51k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Transcript
http://xkcd.com/{224,297}
Clojure & ClojureScript Stefan Kanev http://skanev.com/ @skanev I.T.A.K.E. Unconf 26
May 2015 Sofia
None
twitter: @skanev github: skanev blog: http://skanev.com/
Clojure from 10,000 feet
A modern LISP, hosted in the JVM, with a focus
on concurrency
A modern LISP, hosted in the JVM, with a focus
on concurrency
LISP: “that language with the parentheses” also: a subculture
“LISP is too hip, even for me” – a hipster
LISP
None
a * b + c * d (+ (* a
b) (* c d))
homoiconicity data is code, code is data
None
A modern LISP, hosted in the JVM, with a focus
on concurrency
Sans the antiquities: car cdr lambda
Way better design
Less parentheses
A modern LISP, hosted in the JVM, with a focus
on concurrency
Stable platform
Access to full Java ecosystem
Occasionally a huge P.I.T.A.
A modern LISP, hosted in the JVM, with a focus
on concurrency
parallelism vs. concurrency
parallelism Breaking a problem down to smaller parts that can
be computed at the same time
concurrency Synchronising a number of independent processes that are fighting
for the same resources
Syntax
(func arg-1 arg-2 …)
(println "Hello world")
(+ 1 2) (< x y)
(+ 1 2 3 4 5 6) (< u v
w x y z)
(+ (* a b) (* c d)) (+ (* a
b) (* c d))
(defn say-hello [who] (println "Hello" who "!")) (say-hello "Doctor")
OMG Parentheses! Or should I say: ((o) ((m)) (g) (
(( (( (( )) )) )) ))
Parentheses in LISP are not unlike metric time
(defn classify [age] (if (<= 13 age 19) "Teenager" "A
normal person")) (classify 18) ; "Teenager"
(defn factorial [n] (if (= n 1) 1 (* n
(factorial (- n 1)))))
(defn fib [n] (cond (= n 0) 1 (= n
1) 1 :else (+ (fib (- n 1)) (fib (- n 2)))))
(fn [x] (* x 2))
(map (fn [n] (str "Mr. " n)) ["Anderson" "Bond" "Bean"])
; ("Mr. Anderson” ; "Mr. Bond" ; "Mr. Bean")
(filter prime? (range 2 100)) ; (2 3 5 7
11 13 17 19 23 29 31 37 41 ; 43 47 53 59 61 67 71 73 79 83 89 97)
(defn prime? [n] (not-any? (fn [x] (zero? (rem n x)))
(range 2 (inc (Math/sqrt n)))))
Data Structures
maps (hashes) vectors (arrays) sets
immutable
“Modifying” a structure creates a copy containing the change. The
original remains unmodified.
Y
simplicity
multicore ❤ immutable
persistent
The “originals” are maximally reused
a ! (3 2 1)
1 2 3 a a ! (3 2 1)
a ! (3 2 1) b ! (conj a 4)
(4 3 2 1)
1 2 3 a a ! (3 2 1) b
! (4 3 2 1) 4 b 5 c c ! (conj a 5)
Hash Table 1020394597 1020205863 {:foo first, :bar second} first second
Hash Table 1020394597 1020205863 Hash Table 1020394597 1020205863 1021027443 (conj
table :qux 1024)
not that simple
Vectors (“arrays” in other langs)
Vectors are represented by trees Each node has 32 children
log32 … …
… … ⨯
O(?)
log32 n
325 = 33 554 432 326 = 1 073 741
824
“essentially constant time”
None
Software Transactional Memory
concurrency 101
100 € +50 € ⨯2 How much money will the
account have?
300 € 250 €
100 € +50 € = 150 € x2 = 300
€
100 € x2 = 200 € +50 € = 250
€
100 € 200 € 150 € x2 +50 100 €
100 €
100 € 150 € 200 € x2 +50 100 €
100 €
ref
state mutation is modelled as a transaction
if two transactions “get in each others’ way”, one of
them will restart
(def account (ref 100)) ; Thread 1 - Uncle Scrooge
(dosync (alter account (fn [n] (* n 2))) (println "Scrooge: set to " @account)) ; Thread 2 - Donald Duck (dosync (alter account (fn [n] (+ n 50))) (println "Donald: set to " @account))
100 € 300 € 150 € x2 +50 100 €
100 € X x2 150 €
Y
familiar
safe, easy, no deadlocks
Macros
Powerful instrument allowing expressive code
Also known as: the mother of all metaprogramming
Macro Code Some other code
None
doStuff();
Outputs on STDOUT. We want to have the result in
a string instead.
PrintStream original = System.out; ByteArrayOutputStream output = new ByteArrayOutputStream(); try
{ PrintStream fileStream = new PrintStream(output); orgStream = System.out; System.setOut(fileStream); doStuff(); } finally { System.setOut(original); } String output = output.toString();
(do-stuff)
(with-out-str (do-stuff))
(with-out-str (do-stuff))
String output = withOutStr { doStuff(); }
unless
(unless (hungry?) (sleep) (eat)) (if (not (hungry?)) (sleep) (eat))
(defmacro unless [condition consequent alternative] `(if (not ~condition) ~consequent ~alternative))
unless (isHungry()) { sleep(); } else { eat(); }
(cond (= n 0) 1 (= n 1) 1 :else
(+ (fib (- n 2)) (fib (- n 1)))) (if (= n 0) 1 (if (= n 1) 1 (+ (fib (- n 2)) (fib (- n 1)))))
DSL Domain Specific Languages
Transparency
(source if-let) (source await)
ClojureScript
om
Very dynamic
DEMO
REPL Oriented Programming
None