Slide 1

Slide 1 text

======================================== ! FUNCTIONAL PROGRAMMING WITH CLOJURE ! ========================================

Slide 2

Slide 2 text

1. SIDE EFFECT FREE 2. IMMUTABILITY 3. FIRST CLASS FUNCTIONS 4. FUNCTION BASED CONTROL FLOW ======================================== FUNCTIONAL PROGRAMMING ======================================== [1] ========================================

Slide 3

Slide 3 text

[2] +-----------------------+ | IMPERATIVE SHELL | | | | +-------------------+ | | | FUNCTIONAL CORE | | | | | | | +-------------------+ | +-----------------------+

Slide 4

Slide 4 text

1. LISP DIALECT 2. JVM & JS TARGETS 3. DYNAMIC 4. HOMOICONICITY 5. IMMUTABILITY 6. PLATFORM INTEROP 7. SMALL POWERFUL CORE 8. CONCURRENCY ======================================== CLOJURE ======================================== ========================================

Slide 5

Slide 5 text

======================================== ! SYNTAXING? ! ========================================

Slide 6

Slide 6 text

======================================== ! ======================================== 1 + 2

Slide 7

Slide 7 text

======================================== ! ======================================== (+ 1 2)

Slide 8

Slide 8 text

======================================== ! ======================================== add(1, 2)

Slide 9

Slide 9 text

======================================== ! ======================================== (add 1, 2)

Slide 10

Slide 10 text

======================================== ! ======================================== (add 1 2)

Slide 11

Slide 11 text

======================================== ! ======================================== 1 / 2 * 3

Slide 12

Slide 12 text

======================================== ! ======================================== (/ 1 (* 2 3))

Slide 13

Slide 13 text

======================================== ! CLOJURE BY EXAMPLE ! ========================================

Slide 14

Slide 14 text

➜ brew install leiningen ---------------------------------------- ➜ curl -Lo lein http://bit.ly/1m8fHx2 ➜ chmod a+x lein ➜ ./lein ======================================== INSTALLING LEININGEN ======================================== ========================================

Slide 15

Slide 15 text

➜ lein repl ! nREPL server started on port ... Clojure 1.6.0 ! user=> ======================================== THE REPL ======================================== ========================================

Slide 16

Slide 16 text

user=> (doc map) ; ------------------ ! user=> (find-doc "fold") ; ------------------ ======================================== THE REPL ======================================== ========================================

Slide 17

Slide 17 text

======================================== ! DATA TYPES ! ========================================

Slide 18

Slide 18 text

(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 ======================================== ========================================

Slide 19

Slide 19 text

(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 ======================================== ========================================

Slide 20

Slide 20 text

(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 ======================================== ========================================

Slide 21

Slide 21 text

(= __ true) (= __ (= 2 2/1)) (= :a (keyword __)) (= __ (== 2.0 2)) (= __ (= "a" :a 'a)) (= __ (= 2 2/1)) (not= __ false) (= false (not __)) ======================================== POP QUIZ HOT SHOT ======================================== ======================================== [3]

Slide 22

Slide 22 text

======================================== ! LISTS, VECTORS & SETS ! ========================================

Slide 23

Slide 23 text

(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 ======================================== ========================================

Slide 24

Slide 24 text

(= __ (count '(42))) (= __ (conj [1 2] 3)) (= __ (cons 1 [2 3])) (= __ (first [1 2 3])) (= __ (last [1 2 3])) ======================================== LISTS, VECTORS & SETS ======================================== ========================================

Slide 25

Slide 25 text

(= __ (rest [1 2 3])) (= __ (nth [1 2 3] 2)) (= __ (peek [1 2 3])) (= __ (pop [1 2 3])) (= __ (rest [])) ======================================== LISTS, VECTORS & SETS ======================================== ========================================

Slide 26

Slide 26 text

======================================== ! MAPS ! ========================================

Slide 27

Slide 27 text

(hash-map {:a 1}) (hash-map {:a 1 :b}) { :a 1 } ERROR! ======================================== MAPS ======================================== ========================================

Slide 28

Slide 28 text

(= __ (get {:b 2} :b)) (= __ ({:a 1} :a)) (= __ (:a {:a 1})) (= __ (:b {:a 1})) (= __ (:b {:a 1} 2)) ======================================== MAPS ======================================== ========================================

Slide 29

Slide 29 text

(= __ (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 ======================================== ========================================

Slide 30

Slide 30 text

(= __ (contains? {:a nil :b nil} :b)) (= __ (keys {:a 1 :b 2})) (= __ (vals {:a 1 :b 2})) ======================================== MAPS ======================================== ========================================

Slide 31

Slide 31 text

======================================== ! FUNCTIONS ! ========================================

Slide 32

Slide 32 text

(def sq (fn [a] (* a a))) (defn sq [a] (* a a)) (def sq #(* % %)) ======================================== FUNCTIONS ======================================== ========================================

Slide 33

Slide 33 text

(= __ ((fn [n] (* 5 n)) 2)) (= __ (#(* 15 %) 4)) (= __ (#(+ %1 %2 %3) 4 5 6)) (= __ (#(* 15 %2) 1 2)) (= 9 (((fn [] ___)) 4 5)) ======================================== FUNCTIONS ======================================== ========================================

Slide 34

Slide 34 text

======================================== ! CONDITIONALS ! ========================================

Slide 35

Slide 35 text

(= __ (if (false? (= 4 5)) :a :b)) (= __ (if (> 4 3) [])) ======================================== CONDITIONALS ======================================== ========================================

Slide 36

Slide 36 text

(let [x 5] (= :your-road (cond (= x __) :road-not-taken (= x __) :another-not-taken :else __))) ======================================== CONDITIONALS ======================================== ========================================

Slide 37

Slide 37 text

(let [choice 5] (= :your-road (case choice __ :road-not-taken __ :your-road :another-not-taken))) ======================================== CONDITIONALS ======================================== ========================================

Slide 38

Slide 38 text

======================================== ! LOOPING ! ========================================

Slide 39

Slide 39 text

(= __ (loop [v 1] (if-not (> v 5) (recur (inc v)) v)) ======================================== LOOPING ======================================== ========================================

Slide 40

Slide 40 text

======================================== ! HIGHER ORDER FUNCTIONS ! ========================================

Slide 41

Slide 41 text

(= [__ __ __] (map #(* 4 %) [1 2 3])) (= __ (filter nil? [:a :b nil :c :d])) (= __ (reduce * [1 2 3 4])) ======================================== HIGHER ORDER FUNCTIONS ======================================== ========================================

Slide 42

Slide 42 text

======================================== ! LAZY SEQUENCES ! ========================================

Slide 43

Slide 43 text

(= __ (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 ======================================== ========================================

Slide 44

Slide 44 text

======================================== ! USEFUL MACROS ! ========================================

Slide 45

Slide 45 text

(= __ (-> "a b c d" .toUpperCase (.replace "A" "X") (.split " ") first)) ======================================== USEFUL MACROS ======================================== ========================================

Slide 46

Slide 46 text

(= __ (->> (range) (filter even?) (take 10) (reduce +))) ======================================== USEFUL MACROS ======================================== ========================================

Slide 47

Slide 47 text

(= __ (try (/ 1 0) true (catch Exception e false))) ======================================== USEFUL MACROS ======================================== ========================================

Slide 48

Slide 48 text

======================================== ! ATOMS ! ========================================

Slide 49

Slide 49 text

(let [my-atom (atom 1)] (= __ @my-atom) (swap! my-atom inc) (= __ @my-atom) (reset! my-atom 4) (= __ @my-atom)) ======================================== ATOMS ======================================== ========================================

Slide 50

Slide 50 text

1. JAVA INTEROP 2. MACROS 3. DESTRUCTURING 4. RECORDS 5. PROTOCOLS 6. COMPREHENSION 7. TRANSDUCERS 8. CLOJURESCRIPT ======================================== (REST CLOJURE) ======================================== ========================================

Slide 51

Slide 51 text

======================================== 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

Slide 52

Slide 52 text

======================================== DEAD TREE EDITION ======================================== ======================================== 1. JOY OF CLOJURE 2ND EDITION 2. PROGRAMMING CLOJURE 3. FUNCTIONAL THINKING 4. STRUCTURE & INTERPRETATION OF COMPUTER PROGRAMS

Slide 53

Slide 53 text

======================================== 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 ========================================