Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Clojure & ClojureScript
Stefan Kanev
May 28, 2015
Programming
2
84
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
GraphQL
skanev
0
210
Automated Testing: Getting it Right
skanev
1
40
From Novice to Expert
skanev
0
400
Inbetween Code and Profession
skanev
0
220
Extreme Programming
skanev
0
300
За смъртта на TDD
skanev
0
270
Python 0 2014
skanev
1
1.5k
Clojure 0 2014
skanev
0
360
Garbage Collection
skanev
0
180
Other Decks in Programming
See All in Programming
Cloudflare WorkersでGoを動かすライブラリを作っている話
syumai
1
320
量子コンピュータ時代のプログラミングセミナー / 20230119_Amplify_seminar _shift_optimization
fixstars
0
190
Becoming an Android Librarian (Android World Wide 2023 Jan)
skydoves
1
200
2023年にクル(かもしれない)通信ミドルウェア技術(仮)
s_hosoai
0
200
Hatena Engineer Seminar #23「新卒研修で気軽に『ありがとう』を伝え合える Slack アプリを開発した話」
slashnephy
0
260
僕が考えた超最強のKMMアプリの作り方
spbaya0141
0
180
まだ日本国内で利用できないAppActionsにトライしてみた / MoT TechTalk #15
mot_techtalk
0
110
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
360
ポケモンで学ぶiOS 16弾丸ツアー 🚅
giginet
PRO
1
610
フロントエンドで学んだことをデータ分析で使ってみた話
daichi_igarashi
0
180
How to Fight Production Incidents?
asatarin
0
200
Most Valuable Bug(?) ~インシデント未遂から得た学び~
tatsumiakahori
0
150
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
351
21k
Designing for Performance
lara
600
65k
Embracing the Ebb and Flow
colly
75
3.6k
Designing for humans not robots
tammielis
245
24k
How To Stay Up To Date on Web Technology
chriscoyier
779
250k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
38
3.6k
GraphQLの誤解/rethinking-graphql
sonatard
39
7.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
22
1.4k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
128
8.8k
Ruby is Unlike a Banana
tanoku
93
9.5k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
The World Runs on Bad Software
bkeepers
PRO
59
5.7k
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