- Free Documents

advertisement
Abstraction Oriented Programming
Functioneel Programmeren op de JVM met Clojure
Who Rik van Achterberg
Brian van der Bijl Wouter Hassing Mahijs Steen
From
Hogeschool Utrecht
When Juni
Presentatie
Inleiding Doel van het onderzoek Casus RichRail Verschillen met Java Onderwijs Conclusie
Inleiding
Wat is Clojure
defn square x x x define the function square x is the parameter x x x x x
Inleiding
Wat is Functioneel Programmeren
defn double x x map double Dit heeft hetzelfde resultaat als double double double
Inleiding
Wat is Functioneel Programmeren
defn double x x map double Dit heeft hetzelfde resultaat als double double double
Waarom is dit interessant
Doel van het onderzoek
Vragen
Wat zijn de voornaamste verschillen tussen Clojure en Java
Doel van het onderzoek
Vragen
Wat zijn de voornaamste verschillen tussen Clojure en Java Wat zijn de voornaamste voor
en nadelen van Functioneel Programmeren in Clojure t.o.v. Objectgeorienteerd
Programmeren in Java
Doel van het onderzoek
Vragen
Wat zijn de voornaamste verschillen tussen Clojure en Java Wat zijn de voornaamste voor
en nadelen van Functioneel Programmeren in Clojure t.o.v. Objectgeorienteerd
Programmeren in Java Zou de Hogeschool Utrecht er goed aan doen om Functioneel
Programmeren in het informaticacurriculum op te nemen
Versillen met Java
OO versus FP
Versillen met Java
OO versus FP
Versillen met Java
OO vs. FP
Encapsulation
Closures
Versillen met Java
OO vs. FP
Encapsulation
Closures
defn create
let remembers fn remembers
println create
Versillen met Java
OO vs. FP
Encapsulation
Closures
defn create
let remembers fn remembers
println create
Namespaces
Versillen met Java
OO vs. FP
Encapsulation
Closures
defn create
let remembers fn remembers
println create
Namespaces Immutability
Inheritance
class Person public String getFullName / body / class Employee extends Person public
BusinessCard getBusinessCard / body /
Inheritance
defn fullname x
str firstname x lastname x
defn businesscard x
fullname mailaddress x
Inheritance
It is beer to have functions operate on one data structure than to have functions operate on
data structures. Alan J. Perlis
Versillen met Java
OO versus FP Statisch versus Dynamisch
Statis vs. Dynamis
Clojure is dynamisch getypeerd Traditioneel zijn LISPs altijd dynamisch Dynamic typed
system is eenvoudiger te implementeren Macros en code on runtime aanpassen zouden
praktisch onmogelijk zijn met een statisch typering
Versillen met Java
OO versus FP Statisch versus Dynamisch Recursie versus Iteratie
Recursie vs. Iteratie
De functionele oplossing voor iteratie is recursie Tail recursion optimalization
Casus RiRail
Paerns and Frameworks From PoorRail to Richrail
RiRail Java design
RiRail Clojure
RiRail Clojure
Clojure is niet OO
RiRail Clojure
Clojure is niet OO Hoe representeer je een depot, trein, wagon
RiRail Clojure
Clojure is niet OO Hoe representeer je een depot, trein, wagon
def depot atom list list def train train id twagons list def wagon wagon id seats seats status
free
RiRail Clojure
Commandos
Functies op collecties
RiRail Clojure
Commandos
Functies op collecties Lijst van treinen lijst van treinen
RiRail Clojure
Commandos
Functies op collecties Lijst van treinen lijst van treinen Lien naar depot
RiRail Clojure
Commandos
Functies op collecties Lijst van treinen lijst van treinen Lien naar depot Lien naar atom
RiRail Clojure
Commandos
defn tryifexists exist id f error defn newtrain id
fn coll if exists exist some comp partial id objid coll f coll coll str gt error
tryifexists no id fn coll cons train id twagons list coll str gt train id created
str no train created , id exists
RiRail Clojure
Commandos
defn getwagon id
tryifexists yes id fn coll coll str gt number of seats in wagon id seats findobject coll id
str wagon id does not exist
defn delvehicle id
tryifexists yes id fn coll remove comp partial id objid coll str gt id deleted
str id not deleted , it wasnt there to begin with
RiRail Clojure
defn dotoboth wfunc tfunc def inboth dotoboth defn modify at funcs
fn depot withmonad logm mchain intrains tfunc inwagons wfunc depot
let action
withmonad logm mchain funcs
msg action at swap at comp first action doseq msg msg println msg strjoin n msg
RiRail Clojure
Easyaccess
defn newwagoncmd id amp seats inwagons newwagon id first
seats
defn newtraincmd id intrains newtrain id defn getwagoncmd id inwagons getwagon id defn
gettraincmd id intrains gettrain id defn addwagontotraincmd wid tid
inboth setwagon wid connected wagontotrain wid tid
defn removewagonfromtraincmd wid tid
inboth setwagon wid free wagonfromtrain wid tid
defn delwagoncmd id
inboth delvehicle id wagonfromtrain id connectedtrain id
defn deltraincmd id
inboth releasewagons id delvehicle id
RiRail Clojure
Parsers
Simpele functies om bijvoorbeeld karakters te parsen
RiRail Clojure
Parsers
Simpele functies om bijvoorbeeld karakters te parsen Dankzij monads makkelijk te
combineren tot complexe parsers
RiRail Clojure
Parsers
Simpele functies om bijvoorbeeld karakters te parsen Dankzij monads makkelijk te
combineren tot complexe parsers Parsers zijn functies, en kunnen dus alles wat een functie
kan
RiRail Clojure
Parsers
defn anychar strn
if strn nil list first strn . strn substring
defn chartest pred
domonad parserm c anychar when pred c str c
defn ischar c
chartest partial c
RiRail Clojure
Parsers
defn matchstring targetstrn
withmonad parserm if targetstrn mresult domonad parserm c ischar first targetstrn cs
matchstring apply str rest targetstrn
def idparser
str c cs
withmonad parserm both mplus matchstring wg matchstring tr number
def typeparser
withmonad parserm mplus matchstring wagon matchstring train
RiRail Clojure
Parsers
def newcommandparser
domonad parserm objtype id seats if objtype train fn depot modify depot newtraincmd id if nil
seats fn depot modify depot newwagoncmd id fn depot modify depot newwagoncmd id seats
matchstring new whitespace typeparser whitespace idparser optional numseatsparser
RiRail Clojure
def parsecommand
withmonad parserm mplus addcommandparser newcommandparser getcommandparser
deletecommandparser removecommandparser printcommandparser
defn doevaluate string
eval first parsecommand string depot
RiRail Clojure
Interop
UIs in Clojure bestaan voornamelijk uit interop
RiRail Clojure
Interop
UIs in Clojure bestaan voornamelijk uit interop In plaats daarvan interop gebruikt om aan
Java versie te koppelen
RiRail Clojure
Interop
UIs in Clojure bestaan voornamelijk uit interop In plaats daarvan interop gebruikt om aan
Java versie te koppelen Zet Clojure structuren om in Java structuren
RiRail Clojure
Interop
ns com.richrail.interop.state
genclass name com.richrail.state.ClojureStateProvider prefix methodimplements
com.richrail.state.StateProvider import java.util.ArrayList com.richrail.state.DepotState
com.richrail.state.TrainState com.richrail.state.WagonState use com.richrail.core
defn train gtobject train
TrainState. objid train ArrayList. reverse map fn id wagon gtobject findobject wagons depot id
twagons train
defn methodgetState
DepotState. ArrayList. map train gtobject reverse trains depot
ArrayList. map wagon gtobject reverse wagons
Onderwijs
FP in het onderwijs
Onderwijs
FP in het onderwijs Onze ervaring
Onderwijs
FP in het onderwijs Onze ervaring Wij zeggen doen
Conclusie
Clojure is
Conclusie
Clojure is Declaratief vs Imperatief
Conclusie
Clojure is Declaratief vs Imperatief Functioneel vs OOP
Conclusie
Clojure is Declaratief vs Imperatief Functioneel vs OOP Onderwijs
Download