Slide 1

Slide 1 text

Zero to Clojure in 90 Minutes Colin Jones Software Craftsman at 8th Light @trptcolin Thursday, August 12, 2010

Slide 2

Slide 2 text

What is Clojure? Thursday, August 12, 2010

Slide 3

Slide 3 text

(It’s a Lisp) Thursday, August 12, 2010

Slide 4

Slide 4 text

It runs on the JVM Thursday, August 12, 2010

Slide 5

Slide 5 text

Created in 2007 by Rich Hickey Thursday, August 12, 2010

Slide 6

Slide 6 text

Why should we care? Thursday, August 12, 2010

Slide 7

Slide 7 text

Learning is good. Thursday, August 12, 2010

Slide 8

Slide 8 text

Concurrency can be scary. Thursday, August 12, 2010

Slide 9

Slide 9 text

Side effects can cause a mess. Thursday, August 12, 2010

Slide 10

Slide 10 text

Functional programming can help Thursday, August 12, 2010

Slide 11

Slide 11 text

Syntax & Data Structures Thursday, August 12, 2010

Slide 12

Slide 12 text

Expressions (doc +) (find-doc “regex”) Thursday, August 12, 2010

Slide 13

Slide 13 text

Numbers Integer 42 Long 9999999999999 BigInteger 9999999999999999999 Double 4.2 BigDecimal 4000.2M Ratio 1/3 Thursday, August 12, 2010

Slide 14

Slide 14 text

More String “go to the” Character \p \a \r \k Regex #”\d+” Nil nil Boolean true false Keyword :really/soon Symbol some-time Thursday, August 12, 2010

Slide 15

Slide 15 text

Collections List (1 2 3 4 5) Vector [1 2 3 4 5] Map {:first-name “colin”, :last-name “jones”} Set #{a b c d e} Thursday, August 12, 2010

Slide 16

Slide 16 text

Expressions (doc +) (find-doc “regex”) Thursday, August 12, 2010

Slide 17

Slide 17 text

Diving in Thursday, August 12, 2010

Slide 18

Slide 18 text

Clojure Functional Koans http://trptcolin.github.com USB Drives Thursday, August 12, 2010

Slide 19

Slide 19 text

REPL => Read => Evaluate => Print Thursday, August 12, 2010

Slide 20

Slide 20 text

java -jar /path/to/clojure.jar (+ JRE functional-koans) => WIN! From Functional Koans directory: Mac / Linux: ./repl.sh Windows: repl From anywhere: Thursday, August 12, 2010

Slide 21

Slide 21 text

Functions Thursday, August 12, 2010

Slide 22

Slide 22 text

clojure.test user=> (is (= 1 2)) FAIL in clojure.lang.PersistentList$EmptyList@1 15) expected: (= 1 2) actual: (not (= 1 2)) false user=> (use ‘clojure.test) nil user=> (is (= 1 1)) true Thursday, August 12, 2010

Slide 23

Slide 23 text

Equality user=> (is (= “Colin” “Colin”)) true user=> (is (= nil nil)) true user=> (is (= ‘(1 2 3) [1 2 3])) true user=> (is (= 1.0 1 4/4)) true Thursday, August 12, 2010

Slide 24

Slide 24 text

Math fun(ctions) user=> (is (= 15 (+ 1 2 3 4 5))) true user=> (is (< 1 2 3)) true Thursday, August 12, 2010

Slide 25

Slide 25 text

Hide and seq? user=> (is (= :a (first [:a :b :c]))) true user=> (is (= [:c :b :a] (reverse [:a :b :c]))) true user=> (is (= [:b :c] (rest [:a :b :c]))) true Thursday, August 12, 2010

Slide 26

Slide 26 text

Defining our own functions user=> (def square-1 (fn [x] (* x x))) #‘user/square-1 user=> (defn square-3 [x] (* x x)) #‘user/square-3 user=> (def square-2 #(* % %)) #‘user/square-2 user=> (is (= 9 (square-1 3))) true user=> (is (= 9 (square-2 3))) true user=> (is (= 9 (square-3 3))) true Thursday, August 12, 2010

Slide 27

Slide 27 text

map user=> (defn square [x] (* x x)) #‘user/square user=> (is (= ‘(1 4 9 16 25) (map square ‘(1 2 3 4 5)))) true Thursday, August 12, 2010

Slide 28

Slide 28 text

filter user=> (is (= [odd?] (filter fn? [“odd” :odd odd?]))) true Thursday, August 12, 2010

Slide 29

Slide 29 text

apply user=> (is (= “dog” (str \d \o \g))) true user=> (is (= “dog” (str dog-letters))) FAIL in clojure.lang.PersistentList$EmptyList expected: (= “dog” (str dog-letters)) actual: (not (= “dog” “[\\d \\o \\g]”)) false user=> (def dog-letters [\d \o \g]) true user=> (is (= “dog” (apply str dog-letters))) true Thursday, August 12, 2010

Slide 30

Slide 30 text

Laziness Thursday, August 12, 2010

Slide 31

Slide 31 text

The whole numbers user=> (def whole-numbers (iterate inc 0)) #‘user/whole-numbers user=> (is (= (range 20 40) (take 20 (drop 20 whole-numbers)))) true user=> (is (= (range 0 20) (take 20 whole-numbers))) true Thursday, August 12, 2010

Slide 32

Slide 32 text

Let’s try it in the REPL user=> (def whole-numbers (iterate inc 0)) #‘user/whole-numbers user=> whole-numbers (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 OH NOEZ!!! Thursday, August 12, 2010

Slide 33

Slide 33 text

Don’t hold onto your head user=> (def whole-numbers (iterate inc 0)) #‘user/whole-numbers user=> (first (drop 10000000 whole-numbers)) Exception in thread "main" java.lang.OutOfMemoryError: Java heap space user=> (defn whole-numbers [] (iterate inc 0)) #'user/whole-numbers user=> (first (drop 10000000 (whole-numbers))) 10000000 Thursday, August 12, 2010

Slide 34

Slide 34 text

BIG NUMBERS!!! Thursday, August 12, 2010

Slide 35

Slide 35 text

Clojure Functional Koans Thursday, August 12, 2010

Slide 36

Slide 36 text

Background Aaron Bedra of Relevance based on EdgeCase’s Ruby Koans Thursday, August 12, 2010

Slide 37

Slide 37 text

Towards Clojure Enlightement Mac / Linux: ./run.sh Windows: run Thursday, August 12, 2010

Slide 38

Slide 38 text

Managing State Thursday, August 12, 2010

Slide 39

Slide 39 text

vars user=> (def x 42) #‘user/x user=> (let [x :foo] x) :foo user=> x 42 user=> x 42 Thursday, August 12, 2010

Slide 40

Slide 40 text

refs user=> (def attendees (ref 30)) #‘user/attendees user=> attendees # user=> @attendees 30 user=> (alter attendees dec) java.lang.IllegalStateException: No transaction running user=> (dosync (alter attendees dec)) 29 user=> @attendees 29 Thursday, August 12, 2010

Slide 41

Slide 41 text

refs (defn transfer [amount a b] (dosync (alter a - amount) (alter b + amount))) (def checking (ref 10)) (def savings (ref 50)) Bank Accounts Branch (transfer 25 checking savings) snapshot (checking=10, savings=50) checking = 60, savings=0 ATM (transfer 25 checking savings) snapshot (checking=10, savings=50) commit (checking=35, savings=25) Conflict discovered! (transfer 25 checking savings) Automatic Retry: commit (checking=60, savings=0) snapshot (checking=35, savings=25) Thursday, August 12, 2010

Slide 42

Slide 42 text

Further Study Thursday, August 12, 2010

Slide 43

Slide 43 text

Books Thursday, August 12, 2010

Slide 44

Slide 44 text

The Internets Functional Koans http://github.com/relevance/functional-koans/tree/clojure Web docs http://clojure.org/ Google Group http://groups.google.com/group/clojure IRC #clojure on freenode.net Thursday, August 12, 2010

Slide 45

Slide 45 text

Questions? Thursday, August 12, 2010

Slide 46

Slide 46 text

Uncle Bob Martin, Corey Haines, Dave Astels, Ken Auer, Chad Fowler, Keavy McMinn, Michael Feathers, Doug Bradbury, Enrique Comba Riepenhausen, and more... Thursday, August 12, 2010