![Page 1: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/1.jpg)
TEACH YOUR EYE TO EAT (CLOJURE)StL Java User Group
![Page 2: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/2.jpg)
Nouns verbing other nounsOO
pitcher.pitch(:curve, batter)
user.setEmail(“[email protected]”)
pitcher.pitch(:curve, ball, batter)
![Page 3: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/3.jpg)
OO
pitcher.pitch(:curve, ball, batter)
Nouns verbing other nouns
![Page 4: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/4.jpg)
OO
pitcher.pitch(:curve, ball, batter)
The pitcher pitches a curve ball to the batter
Left Right
Nouns verbing other nouns
![Page 5: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/5.jpg)
OO
Objects
Relationships
Messages
![Page 6: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/6.jpg)
Clojure => LISPOO
Objects
Relationships
Messages
![Page 7: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/7.jpg)
Clojure => LISPOO
Objects
Relationships
Messages
Code Data
![Page 8: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/8.jpg)
Clojure deals in lists of things
![Page 9: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/9.jpg)
Clojure deals in lists of things
‘(1 2 3 4)
[1 2 3 4]
#{1 2 3 4}
List
Vector
Set
{1 2 3 4} Map
No Commas Needed!
![Page 10: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/10.jpg)
Clojure deals in lists of things
‘(1 2 3 4)
[1 2 3 4]
#{1 2 3 4}
List
Vector
Set
{:hands 2 :limbs 4} Map
No Commas Needed!
![Page 11: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/11.jpg)
Collections are Persistent Data Structures
(concat [1 2] [3]) => (1 2 3)
1
2
3
![Page 12: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/12.jpg)
Data Structures are Declared not Assigned
(def marios-favorite-langs ["ruby" "coffeescript"])
![Page 13: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/13.jpg)
Data Structures are Declared not Assigned
(def marios-favorite-langs ["ruby" "coffeescript"])
=> marios-favorite-languages [ruby coffeescript] !=>(assoc marios-favorite-langs 1 "clojure") [ruby clojure] !=> marios-favorite-langs [ruby coffeescript]
![Page 14: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/14.jpg)
Data structure manipulation yields a new data structure
![Page 15: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/15.jpg)
Clojure is a functional programming language
![Page 16: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/16.jpg)
Clojure is a functional programming language
(pitch ball batter)
![Page 17: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/17.jpg)
(pitch ball batter)
Reads/Evaluates Left → Right
![Page 18: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/18.jpg)
function parameters
(pitch ball batter)
![Page 19: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/19.jpg)
Prefix Notation
function
parameters
(+ 2 5)
![Page 20: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/20.jpg)
(generate-count (pitch ball batter) inning)
Nested function calls
Reads/Evaluates Inside Out
5
1 2 3
4 6
![Page 21: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/21.jpg)
![Page 22: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/22.jpg)
Things that can go in lists…
Keywords
Symbols
Other lists
Numbers
![Page 23: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/23.jpg)
Numbers
Can (*sometimes) auto-promote (int → BigInt)
Rational Numbers
1 2 3...
1.234
Integers
Floating-point
22/7
![Page 24: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/24.jpg)
Keywords
:are-a-thing-in-clojure
kebab-case-all-
the-things
{:some-key valuetron}
@chrisdlugosz
![Page 25: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/25.jpg)
:keywords & maps
(get {:some-key 123} :some-key) => 123
function
map key
![Page 26: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/26.jpg)
({:some-key 123} :some-key) => 123
:keywords & maps
![Page 27: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/27.jpg)
(:some-key {:some-key 123}) => 123
:keywords & maps
Maps & keywords implement IFn
![Page 28: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/28.jpg)
Symbols
are-the-names-for-values-and-functions
![Page 29: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/29.jpg)
Values
(def marios-twitter “@marioaquino”)
Symbol
![Page 30: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/30.jpg)
3 ways to declare functions
![Page 31: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/31.jpg)
3 ways to declare functions
(defn mix [&foods] {:name mixture :contents foods :taste interesting})
(mix popcorn butter salt parmesan tabasco)
![Page 32: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/32.jpg)
(map (fn [email] (lower-case email)) [“[email protected]” “[email protected]”])
3 ways to declare functions
![Page 33: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/33.jpg)
(map (fn [email] (lower-case email)) [“[email protected]” “[email protected]”])
3 ways to declare functions
![Page 34: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/34.jpg)
(apply (fn power [n e] (if (zero? e) 1 (* n (power n (dec e))))) 3 4 [])
3 ways to declare functions
=> 81 Same as: (* 3 3 3 3)
![Page 35: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/35.jpg)
=>(reduce #(str %1 “ “ %2) [“Mario” “Enrique” “Aquino”])
3 ways to declare functions
“Mario Enrique Aquino”
![Page 36: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/36.jpg)
Constructing algorithms with let
(defn get-rand-threshold [threshold] (let [min (int (* threshold 0.75)) range (int (* threshold 0.5))] (+ min (rand-int range))))
![Page 37: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/37.jpg)
Macros
Compile-time code generation/substitution
![Page 38: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/38.jpg)
Reader Macro
(+ 2 5 9) => 16
![Page 39: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/39.jpg)
Reader Macro
(+ 2 5 #_9) => 7
![Page 40: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/40.jpg)
Reader Macro
Clojure doesn’t have language keywords
![Page 41: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/41.jpg)
Custom Macros
(+ 2 5 9) => 16
(defmacro ignore-last-operand [function-call]
(butlast function-call))
(ignore-last-operand (+ 2 5 9)) => 7
![Page 42: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/42.jpg)
Thread-First Macro
(defn read-resource [path] (read-string (slurp (io/resource path))))
123
![Page 43: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/43.jpg)
Thread-First Macro
(defn read-resource [path] (read-string (slurp (io/resource path)))) !;; using the threading macro (defn read-resource [path] (-> path io/resource slurp read-string))
![Page 44: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/44.jpg)
Clojure is
A LISP
A functional programming language
A JVM language
Sufficiently different from imperative, OO langs
![Page 45: TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf · Clojure is a functional programming language. Clojure is a functional programming language](https://reader034.vdocuments.site/reader034/viewer/2022042406/5f20e606673ec96cf5488fd5/html5/thumbnails/45.jpg)
Find out more…
http://www.infoq.com/presentations/Value-Values
http://clojure.org
http://4clojure.com
http://www.braveclojure.com/