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
110
React
kouphax
2
690
Play for (Java|Scala)
kouphax
0
100
Devops: A Case Study
kouphax
0
65
Scala for C# Developers
kouphax
5
2.5k
Dropwizard - Production Ready Web Services
kouphax
3
1.5k
Scala for Fun & Profit
kouphax
3
610
What Agile Means To Me
kouphax
0
120
Neo4J: A Case Study
kouphax
3
600
Other Decks in Programming
See All in Programming
詳細解説! ArrayListの仕組みと実装
yujisoftware
0
480
現場で役立つモデリング 超入門
masuda220
PRO
12
2.9k
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
150
カラム追加で増えるActiveRecordのメモリサイズ イメージできますか?
asayamakk
4
1.5k
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
390
From Subtype Polymorphism To Typeclass-based Ad hoc Polymorphism- An Example
philipschwarz
PRO
0
170
Modern Angular: Renovation for Your Applications
manfredsteyer
PRO
0
200
2万ページのSSG運用における工夫と注意点 / Vue Fes Japan 2024
chinen
3
1.3k
VR HMDとしてのVision Pro+ゲーム開発について
yasei_no_otoko
0
100
プロジェクト新規参入者のリードタイム短縮の観点から見る、品質の高いコードとアーキテクチャを保つメリット
d_endo
1
1k
Why Spring Matters to Jakarta EE - and Vice Versa
ivargrimstad
0
960
Synchronizationを支える技術
s_shimotori
1
150
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
How STYLIGHT went responsive
nonsquared
95
5.2k
Bash Introduction
62gerente
608
210k
Automating Front-end Workflow
addyosmani
1365
200k
GitHub's CSS Performance
jonrohan
1030
460k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
664
120k
BBQ
matthewcrist
85
9.3k
Making the Leap to Tech Lead
cromwellryan
132
8.9k
Statistics for Hackers
jakevdp
796
220k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
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 ========================================