Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Functional Programming with Clojure
Search
James Hughes
September 23, 2014
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Functional Programming with Clojure
WWCB Clojure session
James Hughes
September 23, 2014
More Decks by James Hughes
See All by James Hughes
Tyrannosaurus Rx
kouphax
0
140
React
kouphax
2
760
Play for (Java|Scala)
kouphax
0
160
Devops: A Case Study
kouphax
0
110
Scala for C# Developers
kouphax
5
2.7k
Dropwizard - Production Ready Web Services
kouphax
3
1.7k
Scala for Fun & Profit
kouphax
4
680
What Agile Means To Me
kouphax
0
180
Neo4J: A Case Study
kouphax
3
710
Other Decks in Programming
See All in Programming
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Jetpack Compose メカニズム
skydoves
0
120
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
270
Building an Out-of-Order CPU
latte72
1
750
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
510
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
110
Security issues being discussed on Web Platforms
petamoriken
0
780
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
140
Featured
See All Featured
Speed Design
sergeychernyshev
33
2.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Done Done
chrislema
186
16k
Crafting Experiences
bethany
1
320
Everyday Curiosity
cassininazir
0
310
Designing for humans not robots
tammielis
254
26k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
900
How to Talk to Developers About Accessibility
jct
2
540
Agile that works and the tools we love
rasmusluckow
331
22k
Paper Plane
katiecoart
PRO
3
53k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
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 ========================================