SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
FUNCTIONAL 
PROGRAMMING 
Real 
Life 
Functional 
Programming 
Sascha 
Koch 
JUG 
Bielefeld 
19.11.2014
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
λ
x
λx.T
S 
T
(λx.R)T
(λx.x 
b 
x 
a) 
pi 
β-­‐Reduktion 
pi 
b 
pi 
a
λx.x 
λx.a 
λf 
x.f 
(f 
x)
(λx 
y.x 
+ 
y) 
1 
2 
(((λx 
y.x 
+ 
y) 
1) 
2) 
((λy.1 
+ 
y) 
2) 
λy.1 
+ 
y
λ 
x 
y.x 
λ 
x 
y.y 
A 
B 
C
λ 
z 
s.z 
λ 
n 
s.n 
s 
Ÿ 
s 
λ 
n 
m 
s.n 
s 
Ÿ 
m 
s
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
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
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
Design 
by 
Tom 
Hickey 
and 
Rich 
Hickey
increment( 
1 
)
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
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
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“
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
Syntax 
• Clojure 
ist 
homoikonisch 
• Datenstrukturen 
sind 
der 
Code 
• Keine 
weitere 
text-­‐basierte 
Syntax 
• Syntax 
ist 
die 
Interpretation 
der 
Datenstruktur
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)
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))
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
Sequences 
• (seq 
coll) 
• (first 
seq) 
• (rest 
seq) 
• Sequences: 
list, 
vector, 
files, 
...
Finally 
Functions 
• Hello 
world 
equivalent: 
factorial 
• Several 
versions 
1. Simple 
approach 
2. Extended 
multiplication 
operator: 
*‘ 
3. Loop-­‐Recur-­‐Pattern 
4. reduce
Live 
Demo
Ring 
Demo
Java 
in 
Clojure 
• Sehr 
einfach: 
(def 
cal 
(java.util.Calendar/getInstance)) 
#‘user/cal 
(.getTimeInMillis 
cal) 
1415399321833 
(System/currentTimeMillis) 
1415703691973
Clojure 
in 
Java 
• Generate 
classes 
for 
Java 
(ns 
de.coruco.binomial 
(:gen-­‐class)) 
(defn 
binomial 
...)
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 
);
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)
Noch 
mehr? 
• midje 
• Clojurescript 
• :clojureD 
• github
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

Weitere ähnliche Inhalte

Was ist angesagt?

Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python Andreas Schreiber
 
Perl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz EditionPerl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz Editionlichtkind
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit RubyDario Rexin
 
Helma Workshop
Helma WorkshopHelma Workshop
Helma WorkshopTriotex
 
Schneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ BindingsSchneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ BindingsPatrick Charrier
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Python Mike Müller
Python Mike MüllerPython Mike Müller
Python Mike MüllerAberla
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwicklerjlink
 

Was ist angesagt? (11)

Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
 
Perl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz EditionPerl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz Edition
 
OpenCL Grundlagen
OpenCL GrundlagenOpenCL Grundlagen
OpenCL Grundlagen
 
Ein Gopher im Netz
Ein Gopher im NetzEin Gopher im Netz
Ein Gopher im Netz
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit Ruby
 
Helma Workshop
Helma WorkshopHelma Workshop
Helma Workshop
 
Schneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ BindingsSchneller Einstieg in OpenCL mit C++ Bindings
Schneller Einstieg in OpenCL mit C++ Bindings
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Python Mike Müller
Python Mike MüllerPython Mike Müller
Python Mike Müller
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwickler
 

Ähnlich wie Einführung in die funktionale Programmierung mit Clojure

Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance ReloadedGregor Goldbach
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerNETUserGroupBern
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware GmbH
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013Oliver Zeigermann
 
Architektur einer Eclipse DLTK IDE für Clojure
Architektur einer Eclipse DLTK IDE für ClojureArchitektur einer Eclipse DLTK IDE für Clojure
Architektur einer Eclipse DLTK IDE für ClojureMatthias Köster
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to RubyJonathan Weiss
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumTorsten Fink
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershellCreasoft AG
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...André Krämer
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenJörn Dinkla
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsQAware GmbH
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenJörn Dinkla
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotationsdzuvic
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungengedoplan
 

Ähnlich wie Einführung in die funktionale Programmierung mit Clojure (20)

Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET Entwickler
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
Testing tools
Testing toolsTesting tools
Testing tools
 
Enterprise JS
Enterprise JS Enterprise JS
Enterprise JS
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
 
Architektur einer Eclipse DLTK IDE für Clojure
Architektur einer Eclipse DLTK IDE für ClojureArchitektur einer Eclipse DLTK IDE für Clojure
Architektur einer Eclipse DLTK IDE für Clojure
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins Koroutinen
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturieren
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotations
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungen
 

Einführung in die funktionale Programmierung mit Clojure

  • 1. FUNCTIONAL PROGRAMMING Real Life Functional Programming Sascha Koch JUG Bielefeld 19.11.2014
  • 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
  • 3. λ
  • 4. x
  • 6. S T
  • 8. (λx.x b x a) pi β-­‐Reduktion pi b pi a
  • 9. λx.x λx.a λf x.f (f x)
  • 10. (λx y.x + y) 1 2 (((λx y.x + y) 1) 2) ((λy.1 + y) 2) λy.1 + y
  • 11.
  • 12. λ x y.x λ x y.y A B C
  • 13. λ z s.z λ n s.n s Ÿ s λ n m s.n s Ÿ m s
  • 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
  • 17. Design by Tom Hickey and Rich Hickey
  • 19. 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
  • 20. 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
  • 21. 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“
  • 22. 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
  • 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
  • 27. Sequences • (seq coll) • (first seq) • (rest seq) • Sequences: list, vector, files, ...
  • 28. Finally Functions • Hello world equivalent: factorial • Several versions 1. Simple approach 2. Extended multiplication operator: *‘ 3. Loop-­‐Recur-­‐Pattern 4. reduce
  • 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)
  • 35. Noch mehr? • midje • Clojurescript • :clojureD • github
  • 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