Einführung in die funktionale Programmierung mit Clojure

36
FUNCTIONAL PROGRAMMING Real Life Functional Programming Sascha Koch JUG Bielefeld 19.11.2014

description

Diese Präsentation ist im Rahmen eines Treffens der Java User Group Bielefeld entstanden. Ich habe eine Einführung in die funktionale Programmierung an Hand des Lambda Kalküls gegeben. Anschließend haben wir uns die Programmiersprache Clojure angeschaut und einige Beispiele durchgesprochen. Anschließend hat Daniel Rosowski noch funktionale Programmierung mit Guava und Java 8 vorgestellt: http://de.slideshare.net/DanielRosowski/real-lifefp

Transcript of Einführung in die funktionale Programmierung mit Clojure

Page 1: Einführung in die funktionale Programmierung mit Clojure

FUNCTIONAL  PROGRAMMING  Real  Life  Functional  Programming  

Sascha  Koch  JUG  Bielefeld  19.11.2014  

Page 2: Einführung in die funktionale Programmierung mit Clojure

Agenda  •  Einführung  in  die  funktionale  Programmierung  •  Reine  FP  in  der  JVM  an  Hand  von  Clojure  

•  Semi  /  Practical  FP  an  Hand  von  Guava  •  Closures  in  Java  8  • Ausblick  

Page 3: Einführung in die funktionale Programmierung mit Clojure

λ  

Page 4: Einführung in die funktionale Programmierung mit Clojure

x  

Page 5: Einführung in die funktionale Programmierung mit Clojure

λx.T  

Page 6: Einführung in die funktionale Programmierung mit Clojure

S  T  

Page 7: Einführung in die funktionale Programmierung mit Clojure

(λx.R)T  

Page 8: Einführung in die funktionale Programmierung mit Clojure

(λx.x  b  x  a)  pi    

pi  b  pi  a  β-­‐Reduktion  

Page 9: Einführung in die funktionale Programmierung mit Clojure

λx.x  λx.a  λf  x.f  (f  x)  

Page 10: Einführung in die funktionale Programmierung mit Clojure

(λx  y.x  +  y)  1  2  (((λx  y.x  +  y)  1)  2)  ((λy.1  +  y)  2)  λy.1  +  y  

Page 11: Einführung in die funktionale Programmierung mit Clojure
Page 12: Einführung in die funktionale Programmierung mit Clojure

λ  x  y.x  λ  x  y.y  A    B  C  

Page 13: Einführung in die funktionale Programmierung mit Clojure

λ  z  s.z  λ  n  s.n  s  �  s  

λ  n  m  s.n  s  �  m  s  

Page 14: Einführung in die funktionale Programmierung mit Clojure

Unterschiede  zu  imperativen  Sprachen  Funktionale  Sprachen   Imperative  Sprachen  

Building  Blocks   Funktionen   Instruktionen  

Zustand   unveränderlich   wird  modifiziert  

Variablen   An  Ausdruck  gebunden   Speicheradresse  

Programmablauf   Ausdrücke  werden  ausgewertet  

Führt  eine  Menge  von  Instruktionen  aus  

Page 15: Einführung in die funktionale Programmierung mit Clojure

Zusammenfassung  •  Lambda  Kalkül  •  Formales  System  zur  Definition  von  Funktionen  •  Turing-­‐vollständig  •  Wie  die  Turing-­‐Maschine  nur  ein  abstraktes  Modell  •  Grundlage  für  funktionale  Programmiersprachen  

• Alles  sind  Funktionen  •  Kombinatoren  sind  Lambda-­‐Ausdrücke  ohne  freie  Variablen  •  Lambda-­‐Kalkül  +  Typisierung  +  syntaktischer  Zucker  à  FP  

Page 16: Einführung in die funktionale Programmierung mit Clojure

Agenda  •  Einführung  in  die  funktionale  Programmierung  ✔  •  (Reine)  FP  in  der  JVM  an  Hand  von  Clojure  

•  Semi  /  Practical  FP  an  Hand  von  Guava  •  Closures  in  Java  8  • Ausblick  

Page 17: Einführung in die funktionale Programmierung mit Clojure

Design  by  Tom  Hickey  and  Rich  Hickey  

Page 18: Einführung in die funktionale Programmierung mit Clojure

increment    1  )  (  

Page 19: Einführung in die funktionale Programmierung mit Clojure

Installation  1.  Aktuelles  clojure.jar  laden  (http://clojure.org/downloads)  2.  Clone  und  build  von  GitHub  

$  git  clone  https://github.com/clojure/clojure  $  mvn  clean  install  

 •  Clojure  Programm  starten:    $  java  –jar  clojure-­‐x.y.z.jar  file.clj  

•  REPL  starten:    $  rlwrap  java  –jar  clojure-­‐x.y.z.jar  

 

Page 20: Einführung in die funktionale Programmierung mit Clojure

Installation  •  Installiere  aktuelles  Leiningen  (http://leiningen.org)    

$  lein  repl  $  lein  new  project  $  lein  test  $  lein  run  $  lein  jar  $  lein  uberjar  $  lein  deploy  clojars  (benötigt  clojars.org  account)      http://www.classicshorts.com/stories/lvta.html  

Page 21: Einführung in die funktionale Programmierung mit Clojure

Atomic  Data  Types  • Arbitrary  precision  integers  12345678987654  • Double    1.234  •  BigDecimals  1.234M  •  Ratios    22/7  •  Strings    “fred“  „ethel“  •  Character    \a  \b  •  Symbols    fred  ethel  •  Keywords    :fred  :ethel  • Null      nil    •  Booleans    true  false  •  Regex  patterns  #“a*b“  

Page 22: Einführung in die funktionale Programmierung mit Clojure

Datenstrukturen  •  Liste  –  einzeln  verkettet,  wachsen  von  vorne  •  (1  2  3  4  5),  (fred  ethel  lucy),  (list  1  2  3)  

•  Vectoren  –  Zugriff  via  Index,  wachsen  nach  hinten  •  [1  2  3  4  5],  [fred  ethel  lucy]  

• Maps  (key-­‐value  Paare)  •  {:a  1,  :b  2,  :c  3},  {1  „ethel“  2  „fred“}  

•  Sets  •  #{fred  ethel  lucy}  

•  Everything  nests  

Page 23: Einführung in die funktionale Programmierung mit Clojure

Syntax  •  Clojure  ist  homoikonisch  • Datenstrukturen  sind  der  Code    •  Keine  weitere  text-­‐basierte  Syntax  •  Syntax  ist  die  Interpretation  der  Datenstruktur    

Page 24: Einführung in die funktionale Programmierung mit Clojure

Ausdrücke  und  Operationen  • Alles  ist  ein  Ausdruck  expression  • Die  Datenliterale  repräsentieren  sich  selbst  • Außer  bei  Listen  und  Symbolen  (dann  passiert  etwas)  •  Symbole  –  Binding  zu  einem  Wert  gesucht  (lokal  let,    global  def)  •  Liste  –  führt  eine  bestimmte  Operation  aus  (op)  

•  (op  ...)  •  op  kann  folgendes  sein:  •  Spezielle  Op  (siehe  clojure.lang.Compiler.java)    à  MAGIE  •  Makro  •  Funktion  (Ausdruck  welcher  eine  Funktion  ergibt)  

Page 25: Einführung in die funktionale Programmierung mit Clojure

Funktionen  •  First  class  values    (def  five  5)  (def  sqr  (fn  [x]  (*  x  x)))  (sqr  five)  25  

• Makro  defn  (defn  sqr  „This  method  calculates  the  square  root  of  n“          [x]            (*  x  x))  

 

Page 26: Einführung in die funktionale Programmierung mit Clojure

Makros  •  defmacro  

• macroexpand    

•  Beispiel  „first“  oder  „ifnot“  •  (defn  ff  [a  b]  a)  (defmacro  mf  [a  b]  a)    

•  (defn  fifnot  [i  t  e]  (if  (not  i)  t  e))  (defmacro  mifnot  [i  t  e]  `(if  (not  ~i)  ~t  ~e))  

 • Weitere  Informationen:  http://clojure.org/macros  

Page 27: Einführung in die funktionale Programmierung mit Clojure

Sequences  •  (seq  coll)  •  (first  seq)  •  (rest  seq)      •  Sequences:  list,  vector,  files,  ...  

Page 28: Einführung in die funktionale Programmierung mit Clojure

Finally  Functions    • Hello  world  equivalent:  factorial  

•  Several  versions  1.  Simple  approach  2.  Extended  multiplication  operator:  *‘  3.  Loop-­‐Recur-­‐Pattern  4.  reduce  

Page 29: Einführung in die funktionale Programmierung mit Clojure

Live  Demo  

Page 30: Einführung in die funktionale Programmierung mit Clojure

Ring  Demo  

Page 31: Einführung in die funktionale Programmierung mit Clojure

Java  in  Clojure  •  Sehr  einfach:    (def  cal  (java.util.Calendar/getInstance))  #‘user/cal    (.getTimeInMillis  cal)  1415399321833    (System/currentTimeMillis)  1415703691973  

Page 32: Einführung in die funktionale Programmierung mit Clojure

Clojure  in  Java  • Generate  classes  for  Java    (ns  de.coruco.binomial      (:gen-­‐class))    (defn  binomial  ...)    

Page 33: Einführung in die funktionale Programmierung mit Clojure

Clojure  in  Java  • As  of  Clojure  1.6.0:    import  clojure.java.api.Clojure;  import  clojure.lang.Ifn;    ...    Ifn  require  =  Clojure.var(  „clojure.core“,  „require“  );  require.invoke(  Clojure.read(  „de.coruco.binomial“  )  );    Ifn  binomi  =  Clojure.var(  „de.coruco.binomial“,  „binomial“  );  Object  result  =  binomi.invoke(  7,  6  );  

Page 34: Einführung in die funktionale Programmierung mit Clojure

Sechs  Regeln  der  Clojure  Programmierung  

1.  Vermeide  direkte  Rekursion  2.  Benutze  recur  um  Skalare  oder    kurze  Sequenzen  zu  

verarbeiten  3.  Verwende  lazy  Sequenzen  um  lange  Sequenzen  zu  

verarbeiten  4.  Erzeuge  nicht  unnötige  Teile  einer  lazy  Sequenz  5.  Lernen  Du  musst  die  Funktionen  von  Sequenzen  6.  Zerteile  selbst  einfache  Probleme  in  triviale  Probleme  und  

Du  wirst  eine  Lösung  in  der  Standard-­‐Bibliothek  finden  (Teile  und  Herrsche)  

Page 35: Einführung in die funktionale Programmierung mit Clojure

Noch  mehr?  • midje  

•  Clojurescript  

•  :clojureD  

•  github  

Page 36: Einführung in die funktionale Programmierung mit Clojure

Agenda  •  Einführung  in  die  funktionale  Programmierung  ✔  •  Reine  FP  in  der  JVM  an  Hand  von  Clojure  ✔  

•  Semi  /  Practical  FP  an  Hand  von  Guava  •  Closures  in  Java  8  • Ausblick