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
Functional Programming with Clojure
Search
James Hughes
September 23, 2014
Programming
1
100
Functional Programming with Clojure
WWCB Clojure session
James Hughes
September 23, 2014
Tweet
Share
More Decks by James Hughes
See All by James Hughes
Tyrannosaurus Rx
kouphax
0
95
React
kouphax
2
680
Play for (Java|Scala)
kouphax
0
100
Devops: A Case Study
kouphax
0
60
Scala for C# Developers
kouphax
5
2.5k
Dropwizard - Production Ready Web Services
kouphax
3
1.4k
Scala for Fun & Profit
kouphax
3
610
What Agile Means To Me
kouphax
0
120
Neo4J: A Case Study
kouphax
3
580
Other Decks in Programming
See All in Programming
[SF Ruby, March 2024] Rails on Wasm
palkan
0
380
puregoの活用例
aethiopicuschan
0
220
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
330
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
220
オブジェクト指向のリ・オリエンテーション~歴史を振り返り、AI時代に向きなおる~
hanyudaeiiti
10
5.6k
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
ONE WEDGE_company_guide
1wedge_one
0
380
脱・初心者!脱・マネコン!AWS CDKを使ってみませんか!?
har1101
0
300
Git Rebase
bkuhlmann
11
1.6k
Hanami and htmx
bkuhlmann
0
190
プールにゆこう
irof
2
120
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
340
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
11
4.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
258
12k
Design by the Numbers
sachag
274
18k
4 Signs Your Business is Dying
shpigford
175
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
321
20k
Gamification - CAS2011
davidbonilla
76
4.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
6
990
What's new in Ruby 2.0
geeforr
337
31k
A better future with KSS
kneath
231
16k
Typedesign – Prime Four
hannesfritz
36
2.1k
Music & Morning Musume
bryan
41
5.6k
Done Done
chrislema
178
15k
Transcript
======================================== ! FUNCTIONAL PROGRAMMING WITH CLOJURE ! ========================================
1. SIDE EFFECT FREE 2. IMMUTABILITY 3. FIRST CLASS FUNCTIONS
4. FUNCTION BASED CONTROL FLOW ======================================== FUNCTIONAL PROGRAMMING ======================================== [1] ========================================
[2] +-----------------------+ | IMPERATIVE SHELL | | | | +-------------------+
| | | FUNCTIONAL CORE | | | | | | | +-------------------+ | +-----------------------+
1. LISP DIALECT 2. JVM & JS TARGETS 3. DYNAMIC
4. HOMOICONICITY 5. IMMUTABILITY 6. PLATFORM INTEROP 7. SMALL POWERFUL CORE 8. CONCURRENCY ======================================== CLOJURE ======================================== ========================================
======================================== ! SYNTAXING? ! ========================================
======================================== ! ======================================== 1 + 2
======================================== ! ======================================== (+ 1 2)
======================================== ! ======================================== add(1, 2)
======================================== ! ======================================== (add 1, 2)
======================================== ! ======================================== (add 1 2)
======================================== ! ======================================== 1 / 2 * 3
======================================== ! ======================================== (/ 1 (* 2 3))
======================================== ! CLOJURE BY EXAMPLE ! ========================================
➜ brew install leiningen ---------------------------------------- ➜ curl -Lo lein http://bit.ly/1m8fHx2
➜ chmod a+x lein ➜ ./lein ======================================== INSTALLING LEININGEN ======================================== ========================================
➜ lein repl ! nREPL server started on port ...
Clojure 1.6.0 ! user=> ======================================== THE REPL ======================================== ========================================
user=> (doc map) ; ------------------ ! user=> (find-doc "fold") ;
------------------ ======================================== THE REPL ======================================== ========================================
======================================== ! DATA TYPES ! ========================================
(class 1) (class "Hello") (class 1.0) (class \H) (class true)
java.lang.Long java.lang.String java.lang.Double java.lang.Character java.lang.Boolean ======================================== DATA TYPES ======================================== ========================================
(class nil) (class (fn [] 1)) (class 5/3) (class :test)
(class 'a) nil clojure.lang.IFn clojure.lang.Ratio clojure.lang.Keyword clojure.lang.Symbol ======================================== DATA TYPES ======================================== ========================================
(class '(1 2)) (class [1 2]) (class #{1 2}) (class
{:a 1 :b 2}) clojure.lang.List* clojure.lang.Vector* clojure.lang.Set* clojure.lang.Map* ======================================== DATA TYPES ======================================== ========================================
(= __ true) (= __ (= 2 2/1)) (= :a
(keyword __)) (= __ (== 2.0 2)) (= __ (= "a" :a 'a)) (= __ (= 2 2/1)) (not= __ false) (= false (not __)) ======================================== POP QUIZ HOT SHOT ======================================== ======================================== [3]
======================================== ! LISTS, VECTORS & SETS ! ========================================
(list 1 2 3 2 1) (vector 1 2 3
2 1) (hash-set 1 2 3 2 1) '(1 2 3 2 1) [1 2 3 2 1] #{1 2 3} ======================================== LISTS, VECTORS & SETS ======================================== ========================================
(= __ (count '(42))) (= __ (conj [1 2] 3))
(= __ (cons 1 [2 3])) (= __ (first [1 2 3])) (= __ (last [1 2 3])) ======================================== LISTS, VECTORS & SETS ======================================== ========================================
(= __ (rest [1 2 3])) (= __ (nth [1
2 3] 2)) (= __ (peek [1 2 3])) (= __ (pop [1 2 3])) (= __ (rest [])) ======================================== LISTS, VECTORS & SETS ======================================== ========================================
======================================== ! MAPS ! ========================================
(hash-map {:a 1}) (hash-map {:a 1 :b}) { :a 1
} ERROR! ======================================== MAPS ======================================== ========================================
(= __ (get {:b 2} :b)) (= __ ({:a 1}
:a)) (= __ (:a {:a 1})) (= __ (:b {:a 1})) (= __ (:b {:a 1} 2)) ======================================== MAPS ======================================== ========================================
(= __ (count {:a 1})) (= __ (:b {:a 1}
2)) (= __ (assoc {:a 1} :b 2)) (= __ (dissoc {:a 1 :b 2} :a)) (= __ (dissoc {:a 1 :b 2} :a :b)) ======================================== MAPS ======================================== ========================================
(= __ (contains? {:a nil :b nil} :b)) (= __
(keys {:a 1 :b 2})) (= __ (vals {:a 1 :b 2})) ======================================== MAPS ======================================== ========================================
======================================== ! FUNCTIONS ! ========================================
(def sq (fn [a] (* a a))) (defn sq [a]
(* a a)) (def sq #(* % %)) ======================================== FUNCTIONS ======================================== ========================================
(= __ ((fn [n] (* 5 n)) 2)) (= __
(#(* 15 %) 4)) (= __ (#(+ %1 %2 %3) 4 5 6)) (= __ (#(* 15 %2) 1 2)) (= 9 (((fn [] ___)) 4 5)) ======================================== FUNCTIONS ======================================== ========================================
======================================== ! CONDITIONALS ! ========================================
(= __ (if (false? (= 4 5)) :a :b)) (=
__ (if (> 4 3) [])) ======================================== CONDITIONALS ======================================== ========================================
(let [x 5] (= :your-road (cond (= x __) :road-not-taken
(= x __) :another-not-taken :else __))) ======================================== CONDITIONALS ======================================== ========================================
(let [choice 5] (= :your-road (case choice __ :road-not-taken __
:your-road :another-not-taken))) ======================================== CONDITIONALS ======================================== ========================================
======================================== ! LOOPING ! ========================================
(= __ (loop [v 1] (if-not (> v 5) (recur
(inc v)) v)) ======================================== LOOPING ======================================== ========================================
======================================== ! HIGHER ORDER FUNCTIONS ! ========================================
(= [__ __ __] (map #(* 4 %) [1 2
3])) (= __ (filter nil? [:a :b nil :c :d])) (= __ (reduce * [1 2 3 4])) ======================================== HIGHER ORDER FUNCTIONS ======================================== ========================================
======================================== ! LAZY SEQUENCES ! ========================================
(= __ (range 1 5)) (= __ (range 5)) (=
[0 1 2 3 4 5] (take __ (range 100))) (= __ (take 20 (iterate inc 0))) (= [:a :a :a :a :a :a] (repeat __ __)) ======================================== LAZY SEQUENCES ======================================== ========================================
======================================== ! USEFUL MACROS ! ========================================
(= __ (-> "a b c d" .toUpperCase (.replace "A"
"X") (.split " ") first)) ======================================== USEFUL MACROS ======================================== ========================================
(= __ (->> (range) (filter even?) (take 10) (reduce +)))
======================================== USEFUL MACROS ======================================== ========================================
(= __ (try (/ 1 0) true (catch Exception e
false))) ======================================== USEFUL MACROS ======================================== ========================================
======================================== ! ATOMS ! ========================================
(let [my-atom (atom 1)] (= __ @my-atom) (swap! my-atom inc)
(= __ @my-atom) (reset! my-atom 4) (= __ @my-atom)) ======================================== ATOMS ======================================== ========================================
1. JAVA INTEROP 2. MACROS 3. DESTRUCTURING 4. RECORDS 5.
PROTOCOLS 6. COMPREHENSION 7. TRANSDUCERS 8. CLOJURESCRIPT ======================================== (REST CLOJURE) ======================================== ========================================
======================================== IT’S DANGEROUS TO GO ALONE… ======================================== ======================================== 1. CLOJURE
GRIMOIRE 2. WEIRD & WONDERFUL CHARACTERS OF CLOJURE 3. CLOJURE DOCS 4. CLOJURE FOR THE BRAVE AND TRUE
======================================== DEAD TREE EDITION ======================================== ======================================== 1. JOY OF CLOJURE
2ND EDITION 2. PROGRAMMING CLOJURE 3. FUNCTIONAL THINKING 4. STRUCTURE & INTERPRETATION OF COMPUTER PROGRAMS
======================================== ATTRIBUTION ======================================== [1]: http://bit.ly/learning-clojure [2]: http://bit.ly/destroy-all-software [3]: http://bit.ly/clojure-koans [4]:
http://bit.ly/clojure-gist ========================================