22
Higher Order Perl Martin Busik [email protected] Vortrag über das Buch von Marc Jason Dominus

Higher Order Perl Martin Busik [email protected] Vortrag über das Buch von Marc Jason Dominus

Embed Size (px)

Citation preview

Page 1: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Higher Order Perl

Martin [email protected]

Vortrag über das Buch von Marc Jason

Dominus

Page 2: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Softwareentwicklung ist geprägt durch Hypes

Page 3: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Sie als Perl-Programmierer sind starken Vorurteilen ausgesetzt

... perl is a write-once language

Page 4: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Räumen Sie die Vorurteile aus, in dem sie Konzepte der FP nutzen

Page 5: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Konzepte der Funktionalen Programmierung können in Perl verwendet werden

$asub = sub {...}

$csub = (...) ? $asub : \&bsub;

$esub = $csub->($dsub,sub{$_*2},..)

$esub->(...)

Page 6: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Das HOP-Buch ändert Ihre Art zu programmieren

… vielleicht sogar ihr Verständnis der Programmierung

Page 7: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Der Schlüssel zu FP in Perl sind Closures

sub add {my $a = shift;sub {

my $b = shift;$a + $b

}}

$add5 = add(5);print $add5->(7);

Page 8: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Mit Closures können Sie globale Variablen eliminieren

$SIG{__WARN__} = commonLogging($opt->{L} || 3);

warn 5, " Starte xyz";

Page 9: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Auch ohne globale Variablen haben Sie einen "Zustand"

*getNextId = sequenceGenerator(5);

$a = getNextId(); # $a enthält 5

$b = getNextId(); # $b enthält 6

Page 10: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Trennen Sie Implementierung und Caching

sub rgb2cmyk {

my($r,$g,$b) = @_;

..

}

sub $rgb2cmyk_cached = wrap(\&rgb2cmyk);

$rgb2cmyk_cached->(@color)

Page 11: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Nutzen Sie Memoization für rekursive Funktionen

sub asub {$n = shift;asub(--$n) if $n > 0

}*asub = wrap(\&asub);asub(5);

sub asub {$n = shift;asub(--$n) if $n > 0

}use Memoize;memoize ‘asub‘;asub(5);

Page 12: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

$dt = {

new => sub{...},

p => sub{...},

q => sub{...}};

$c = $dt->{$p};

die ".." unless

ref($c);

$c->();

Nutzen Sie Dispatch-Tabellen

if($p eq "new")

{...}

elsif($p eq "p")

{...}

elsif($p eq "q")

{...}

else { die ".." }

Page 13: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Nutzen Sie Dispatch-Tabellen – mit und ohne Closures

sub asub {my (...) = @_;my $f1=sub {..}my $f2=sub {...$f1->(..)

}

my $dt = {fall1 => $f1,fall2 => $f2,}

$a = $dt->{$p};

$a->(...)

Page 14: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Verwenden Sie Iteratoren

$i = erzeuge_iterator(...);

$e1 = $i->();

$e2 = $i->next();

$e3 = $i->('next');

$i->hasNext();

$i->('hasNext?');

while(my $e = $i->())

Page 15: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Verwenden Sie Iteratoren... aber nicht nur als for-Ersatz

@s = (...)

for($i=0;$i<@s;$i++)

{operation($s[$i])}

@s = (...)

$i = arr_iter(@s)

while($e = $i->())

{operation($e)}

An dieser Stelle"weiss" man nicht mehr, das über ein Array iteriert wird.

Page 16: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Verwenden Sie Iteratoren... eliminieren Sie Schleifen

@s = (...)$i = 0;while($i < @s) { op1($s[i++])

or last}while($i < @s) { op2($s[i++])

or last}

@s = (...)

$i = arr_iter(@s)

op1($i);

op2($i);

Page 17: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Definieren Sie Operationen auf Iteratoren

igrep

imap

$i = igrep {$_->[0]=~/raute/i} $ai$e = $i->()

$i = imap {{inh => $_}} $ai$e = $i->()

Page 18: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Wandeln Sie Rekursion in Iteration um

... wenn Sie die Abbruchbedinung erst zur Laufzeit formulieren wollen

... wenn die Ergebnismenge unendlich ist

Page 19: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Currying kann zur Code-Wieder- verwendung genutzt werden

sub reduce (&;$@) {...}

$summe = reduce({$a+$b},0,@arr)

$produkt= reduce({$a*$b},1,@arr)

*sumF = reduce({$a+$b},0);

$summe = sumF(@arr);

$spF=reduce({[$a+$b,$a*$b]},[0,1])

Page 20: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Einge Themen, die das Buch be- handelt, habe ich Ihnen vorenthalten

... Datenströme (Streams)... Parser

... Deklarative Programmierung

Page 21: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Konzepte der Funktionalen Programmierung können in Perl verwendet werden

„Aptly named, this truly /is/ a Perl book of a higher order, and essential

reading for every serious Perl programmer“

Damian Conway

Page 22: Higher Order Perl Martin Busik martin.busik@busik.de Vortrag über das Buch von Marc Jason Dominus

Martin Busik ● [email protected]

Danke für Ihre Aufmerksamkeit!

[email protected]