TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf ·...

46
TEACH YOUR EYE TO EAT (CLOJURE) StL Java User Group

Transcript of TEACH YOUR EYE TO EAT (CLOJURE)java.ociweb.com/javasig/knowledgebase/2014-06/eatclojure.pdf ·...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(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

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

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

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

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

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

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

: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

({: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

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

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

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

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

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

(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

(map (fn [email] (lower-case email)) [“[email protected]” “[email protected]”])

3 ways to declare functions

=>([email protected] [email protected])

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

(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

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

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

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

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

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

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

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

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

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

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

Find out more…

http://www.infoq.com/presentations/Value-Values

http://clojure.org

http://4clojure.com

http://www.braveclojure.com/

Page 46: 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

Mario Aquino @marioaquino

!!!

[email protected]