Thread Funktionale Programmierung in Perl (10 answers)
Opened by neniro at 2008-12-19 23:29

neniro
 2008-12-23 12:11
#117402 #117402
User since
2008-12-14
79 Artikel
BenutzerIn
[default_avatar]
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
2
3
4
5
6
7
8
9
10
11
called g(4)
called g(3)
called g(2)
called g(1)
called g(0)
g(0) returns 1
g(1) returns 1
g(2) returns 2
g(3) returns 6
g(4) returns 24
24

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

View full thread Funktionale Programmierung in Perl