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
2. 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
14. 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
15. 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
16. 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
23. Syntax
• Clojure
ist
homoikonisch
• Datenstrukturen
sind
der
Code
• Keine
weitere
text-‐basierte
Syntax
• Syntax
ist
die
Interpretation
der
Datenstruktur
24. 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)
25. 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))
26. 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
31. Java
in
Clojure
• Sehr
einfach:
(def
cal
(java.util.Calendar/getInstance))
#‘user/cal
(.getTimeInMillis
cal)
1415399321833
(System/currentTimeMillis)
1415703691973
32. Clojure
in
Java
• Generate
classes
for
Java
(ns
de.coruco.binomial
(:gen-‐class))
(defn
binomial
...)
33. 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
);
34. 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)
36. 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