Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

53
Abstract ion Oriented Progr amming Functioneel Programmeren op de JVM met Clojure Who? Rik van Achterberg Brian van der Bijl Wouter Hassing Mahijs Steen From? Hogeschool Utrecht When? Juni

Transcript of Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 1/53

Abstraction Oriented ProgrammingFunctioneel Programmeren op de JVM met Clojure

Who? Rik van AchterbergBrian van der BijlWouter HassingMa hijs Steen

From? Hogeschool Utrecht

When? Juni

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 2/53

Presentatie

Inleiding

Doel van het onderzoek

Casus: RichRailVerschillen met JavaOnderwijs

Conclusie

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 3/53

Inleiding

Wat is Clojure?

1 ( defn square [x] (* x x))2 ; define the function square

3 ; [x] is the parameter

4 ; (* x x ) = x * x = x^2

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 4/53

Inleiding

Wat is Functioneel Programmeren?

1 ( defn double [x] (* 2 x))

2 ( map double [1 2 3])

3 ; Dit heeft hetzelfde resultaat als

4 ; [(double 1) (double 2) (double 3)] = [2 4 6]

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 5/53

Inleiding

Wat is Functioneel Programmeren?

1 ( defn double [x] (* 2 x))

2 ( map double [1 2 3])

3 ; Dit heeft hetzelfde resultaat als

4 ; [(double 1) (double 2) (double 3)] = [2 4 6]

Waarom is dit interessant?

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 6/53

Doel van het onderzoek

Vragen

Wat zijn de voornaamste verschillen tussen Clojure en Java?

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 7/53

Doel van het onderzoek

Vragen

Wat zijn de voornaamste verschillen tussen Clojure en Java?

Wat zijn de voornaamste voor- en nadelen vanFunctioneel Programmeren in Clojure t.o.v.Object-georië nteerd Programmeren in Java?

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 8/53

Doel van het onderzoek

Vragen

Wat zijn de voornaamste verschillen tussen Clojure en Java?

Wat zijn de voornaamste voor- en nadelen vanFunctioneel Programmeren in Clojure t.o.v.Object-georië nteerd Programmeren in Java?

Zou de Hogeschool Utrecht er goed aan doen omFunctioneel Programmeren in het informatica-curriculumop te nemen?

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 9/53

Vers illen met Java

OO versus FP

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 10/53

Vers illen met Java

OO versus FP

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 11/53

Vers illen met Java

OO vs. FPEncapsulation

Closures

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 12/53

Vers illen met Java

OO vs. FPEncapsulation

Closures

1 ( defn create []

2 ( let [remembers 5]

3 ( fn [] remembers)))

4 ( println ((create)))

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 13/53

Vers illen met Java

OO vs. FPEncapsulation

Closures

1 ( defn create []

2 ( let [remembers 5]

3 ( fn [] remembers)))

4 ( println ((create)))

Namespaces

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 14/53

Vers illen met Java

OO vs. FPEncapsulation

Closures

1 ( defn create []

2 ( let [remembers 5]

3 ( fn [] remembers)))

4 ( println ((create)))

NamespacesImmutability

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 15/53

Inheritance

1 class Person {

2 public String getFullName() { /* body */ }

3 }

4 class Employee extends Person {

5 public BusinessCard getBusinessCard() { /* body */ }

6 }

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 16/53

Inheritance

1 ( defn full-name [x]

2 ( str (:first-name x) ” ” (:last-name x)))3 ( defn business-card [x]

4 [(full-name) (:mail-address x)])

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 17/53

Inheritance

„It is be er to have functions operate on one data

structure than to have functions operate on datastructures.” - Alan J. Perlis

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 18/53

Vers illen met Java

OO versus FP

Statisch versus Dynamisch

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 19/53

Statis vs. Dynamis

Clojure is dynamisch getypeerd

Traditioneel zijn LISPs altijd dynamisch

Dynamic typed system is eenvoudiger te implementerenMacro’s en code on runtime aanpassen zouden praktischonmogelijk zijn met een statisch typering

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 20/53

Vers illen met Java

OO versus FP

Statisch versus DynamischRecursie versus Iteratie

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 21/53

Recursie vs. Iteratie

De functionele oplossing voor iteratie is recursie

Tail recursion optimalization

C Ri R il

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 22/53

Casus: Ri Rail

Pa erns and Frameworks

From PoorRail to Richrail

Ri R il J d i

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 23/53

Ri Rail: Java design

Ri R il Cl j

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 24/53

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 25/53

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 26/53

Ri Rail: Clojure

Clojure is niet OOHoe representeer je een depot, trein, wagon?

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 27/53

Ri Rail: Clojure

Clojure is niet OOHoe representeer je een depot, trein, wagon?

1 ( def depot ( atom [( list ) ( list )]))

2 ( def train {:train id :twagons ( list )})

3 ( def wagon {:wagon id :seats seats :status :free})

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 28/53

Ri Rail: Clojure

Commando’sFuncties op collecties

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 29/53

Ri Rail: Clojure

Commando’sFuncties op collecties

Lijst van treinen → lijst van treinen

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 30/53

Ri Rail: Clojure

Commando’sFuncties op collecties

Lijst van treinen → lijst van treinenLi en naar depot

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 31/53

Ri Rail: Clojure

Commando’sFuncties op collecties

Lijst van treinen → lijst van treinenLi en naar depot

Li en naar atom

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 32/53

Ri Rail: Clojure

Commando’s

1 ( defn- try-if-exists [exist id f error]

2 ( fn [coll]

3 ( if ((exists? exist) ( some ( comp ( partial = id) obj-id) coll))

4 (f coll)5 [coll [( str ”> ” error)]])))

6

7 ( defn- new-train [id]

8 (try-if-exists :no id

9 ( fn [coll] [( cons {:train id :twagons ( list )} coll) [( str ”> ↲

train ” id ” created” )]])

10 ( str ”no train created, ” id ” exists!” )) )

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 33/53

Ri Rail: Clojure

Commando’s

1 ( defn- get-wagon [id]

2 (try-if-exists :yes id

3 ( fn [coll] [coll [( str ”> number of seats in wagon ” id ” : ” ↲

(:seats (find-object coll id)))]])4 ( str ”wagon ” id ” does not exist” )) )

5

6 ( defn- del-vehicle [id]

7 (try-if-exists :yes id

8 ( fn [coll] [( remove ( comp ( partial = id) obj-id) coll) [( str ↲

”> ” id ” deleted” )]])

9 ( str id ” not deleted, it wasn’t there to begin with!” )) )

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 34/53

Ri Rail: Clojure

1 ( defn- do-to-both [wfunc tfunc]

2 ( fn [depot]

3 (with-monad log-m

4 ((m-chain [(in-trains tfunc) (in-wagons wfunc)]) depot))))

5

6 ( def in-both do-to-both)

7

8 ( defn- modify! [at funcs]

9 ( let [action (with-monad log-m (m-chain funcs))

10 [_ msg] (action @at)]

11 (swap! at ( comp first action))12 ( doseq [msg msg] ( println msg))

13 (str-join ”\n” msg)))

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 35/53

j

Easy-access

1 ( defn- new-wagon-cmd [id & seats] (in-wagons (new-wagon id ( first ↲

seats))))

2 ( defn- new-train-cmd [id] (in-trains (new-train id)))

3 ( defn- get-wagon-cmd [id] (in-wagons (get-wagon id)))

4 ( defn- get-train-cmd [id] (in-trains (get-train id)))

5 ( defn- add-wagon-to-train-cmd [wid tid]

6 (in-both (set-wagon wid :connected) (wagon-to-train wid tid)))

7 ( defn- remove-wagon-from-train-cmd [wid tid]

8 (in-both (set-wagon wid :free) (wagon-from-train wid tid)))

9 ( defn- del-wagon-cmd [id]

10 (in-both (del-vehicle id) (wagon-from-train id (connected-train ↲

id))))

11 ( defn- del-train-cmd [id]

12 (in-both (release-wagons id) (del-vehicle id)))

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 36/53

j

ParsersSimpele functies om bijvoorbeeld karakters te parsen

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 37/53

j

ParsersSimpele functies om bijvoorbeeld karakters te parsen

Dankzij monads makkelijk te combineren tot complexeparsers

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 38/53

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 39/53

Parsers1 ( defn- any-char [strn]

2 ( if (= ”” strn)

3 nil

4 ( list ( first strn) (. strn (substring 1)))))

5 ( defn- char-test [pred]

6 (domonad parser-m

7 [c any-char

8 : when (pred c)]

9 ( str c)))

10 ( defn- is-char [c]

11 (char-test ( partial = c)))

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 40/53

Parsers

1 ( defn- match-string [target-strn]

2 (with-monad parser-m

3 ( if (= ”” target-strn)

4 (m-result ”” )

5 (domonad parser-m

6 [c (is-char ( first target-strn))

7 cs (match-string ( apply str ( rest target-strn)↲

)) ]

8 ( str c cs)))))

9 ( def id-parser

10 (with-monad parser-m (both (m-plus (match-string ”wg”)

11 (match-string ”tr” )) number))↲

)

12 ( def type-parser

13 (with-monad parser-m (m-plus (match-string ”wagon” ) (↲

match-string ”train” ))))

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 41/53

Parsers

1 ( def new-command-parser

2 (domonad parser-m

3 [ _ (match-string ”new” )

4 _ whitespace

5 obj-type type-parser

6 _ whitespace

7 id id-parser

8 seats (optional numseats-parser)

9 ]

10 ( if (= obj-type ”train” )

11 ( fn [depot] (modify! depot [(new-train-cmd id)]))12 ( if ( nil ? seats)

13 ( fn [depot] (modify! depot [(new-wagon-cmd id)]))

14 ( fn [depot] (modify! depot [(new-wagon-cmd id seats)])))↲

)) )

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 42/53

1 ( def parse-command

2 (with-monad parser-m (m-plus add-command-parser ↲

new-command-parser get-command-parser delete-command-parser ↲

remove-command-parser print-command-parser)))

3

4 ( defn- do-evaluate [string]

5 ( eval (( first (parse-command string)) depot)))

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 43/53

InteropUIs in Clojure bestaan voornamelijk uit interop

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 44/53

InteropUIs in Clojure bestaan voornamelijk uit interop

In plaats daarvan interop gebruikt om aan Java versie tekoppelen

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 45/53

InteropUIs in Clojure bestaan voornamelijk uit interop

In plaats daarvan interop gebruikt om aan Java versie tekoppelen

Zet Clojure structuren om in Java structuren

Ri Rail: Clojure

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 46/53

Interop

1 ( ns com.richrail.interop.state

2 (: gen-class

3 : name com.richrail.state.ClojureStateProvider

4 :prefix method-

5 :implements [com.richrail.state.StateProvider])

6 (: import java.util.ArrayList

7 com.richrail.state.DepotState

8 com.richrail.state.TrainState

9 com.richrail.state.WagonState)

10 (: use com.richrail.core))

11 ( defn train->object [train]

12 (TrainState. (obj-id train) (ArrayList. ( reverse ( map ( fn [id] (↲wagon->object (find-object wagons @depot id))) (:twagons train)↲

)))))

13 ( defn method-getState [_]

14 (DepotState. (ArrayList. ( map train->object ( reverse (trains ↲

@depot))))

15 (ArrayList. ( map wagon->object ( reverse (wagons ↲

Onderwijs

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 47/53

FP in het onderwijs?

Onderwijs

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 48/53

FP in het onderwijs?

Onze ervaring

Onderwijs

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 49/53

FP in het onderwijs?

Onze ervaringWij zeggen: doen!

Conclusie

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 50/53

Clojure is…

Conclusie

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 51/53

Clojure is…

Declaratief vs Imperatief

Conclusie

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 52/53

Clojure is…

Declaratief vs Imperatief

Functioneel vs OOP

8/6/2019 Abstraction Oriented Programming: Functioneel programmeren op de JVM met Clojure (presentatie)

http://slidepdf.com/reader/full/abstraction-oriented-programming-functioneel-programmeren-op-de-jvm-met-clojure 53/53