Thread Funktionale Programmierung in Perl
(10 answers)
Opened by neniro at 2008-12-19 23:29
Rekursion ist eines der wesentlichen Werkzeuge bei funktionaler Programmierung. Vielen Programmierern bereitet Rekursion erstmal (und dann immer mal wieder) Kopfschmerzen. Man kann natürlich die entsprechende Funktion mit Debugging-Code vollstopfen um zu sehen, was da vor sich geht, oder man wrappt den Debugging-Code um die Funktion herum (in der OO-Welt als Decorator-Pattern). Hier ein Beispiel mit der Funktion g() die Rekursiv die Fakultät einer Zahl ermittelt:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Sub::Identify; use Sub::Install; sub g { my $i = shift; return 1 if $i == 0; return $i * g->($i-1); } # Decorator sub trace_sub { my $sub = shift; my $subname = Sub::Identify::sub_name( $sub ); my $lvl = 0; Sub::Install::reinstall_sub({ code => sub { my @args = @_; print " " x $lvl++ ."called $subname(" . join(', ', @args) .")\n" ; my $value = $sub->(@args); print " " x --$lvl ."$subname(". join(', ', @args) .") returns $value\n"; return $value; }, as => $subname, }); return; } trace_sub(\&g); print g(4); Der Wrapper nutzt zusätzliche Ausgaben per print und Einrückung um den Verlauf der Rekursion darzustellen: Code: (dl
)
1 called g(4) Natürlich könnte man das Ganze noch etwas spektakulärer gestalten, z.B. mit einer rekursiv definierten Fibonacci-Funktion und der Visualiiserung über Graphviz, aber das Grundprinzip wird klarer. -- yet another amateur perl hacker
|