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