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
120
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
87
GraphQL
skanev
0
410
Automated Testing: Getting it Right
skanev
1
61
From Novice to Expert
skanev
0
430
Inbetween Code and Profession
skanev
0
430
Extreme Programming
skanev
0
730
За смъртта на TDD
skanev
0
580
Python 0 2014
skanev
1
1.7k
Clojure 0 2014
skanev
0
370
Other Decks in Programming
See All in Programming
FindyにおけるTakumi活用と脆弱性管理のこれから
rvirus0817
0
420
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
220
モバイルアプリからWebへの横展開を加速した話_Claude_Code_実践術.pdf
kazuyasakamoto
0
310
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
830
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
480
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
120
速いWebフレームワークを作る
yusukebe
5
1.7k
個人軟體時代
ethanhuang13
0
310
AIコーディングAgentとの向き合い方
eycjur
0
260
TanStack DB ~状態管理の新しい考え方~
bmthd
2
480
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
2.2k
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Writing Fast Ruby
sferik
628
62k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
187
54k
For a Future-Friendly Web
brad_frost
180
9.9k
Six Lessons from altMBA
skipperchong
28
4k
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