Thread Currying in Schleifen (18 answers)
Opened by flowdy at 2012-11-06 22:47

flowdy
 2012-11-06 22:47
#163097 #163097
User since
2012-08-03
45 Artikel
BenutzerIn

user image
Hallo,

ich habe eine Funktion $node->climb_up($curry_sub), die einen Baum von unten nach oben, also aus der Tiefe zur Wurzel durchläuft und jeden Knoten an &$curry_sub übergibt. Nun kann &$curry_sub jederzeit befinden, dass kein weiterer Aufruf mehr getätigt, die Schleife abgebrochen werden soll. Auch return-Aufrufe in &$curry_sub führen zum Abbruch der Schleife und etwaige Rückgabewerte reicht climb_up bloß noch nach draußen durch.

Was ich nicht möchte:
  • irgendwelche speziell subtilen Rückgabewerte von $curry_sub, die climb_up auswertet und die Schleife entsprechend lastet oder nextet.
  • die kommt auch nicht in Frage. Ich unterstütze keinen Selbstmord als Mittel zu einem höheren Zweck. Würde es außerdem notwendig machen, dass climb_up die Exception abfängt, auswerten muss und dadurch mitbestimmt, wie sie aussehen darf (String, Objekt, Zahl, etc.). Ganz hässlich.

Dann muss also eine extra Variable her

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub Node::climb_up {
    my ($self, $sub, $cont) = @_;

    my $p = $self;
    my @ret;
    while ( $p = $p->parent_row ) {
        @ret = $sub->($p,\$cont);
        next if $cont;
    }

    return @ret;
}


Oder vielleicht besser?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub Node::climb_up {
    my ($self, undef, $sub) = @_;
    my $cont = \$_[1]; # Referenz auf urspr. Wert (Pass-by-Reference)

    my $p = $self;
    my @ret;
    while ( $p = $p->parent_row ) {
        @ret = $sub->($p);
        next if $$cont;
    }

    return @ret;
}

my $continue;
my $curry_return = $node->climb_up($continue = 1, sub {
    my $node = shift;
    ...
    $continue = ...;
    return $in_spe;
});


Gibt es noch bessere Ideen? Ich suche nach einem guten Kompromiss zwischen Klarheit und Kürze im Aufrufkontext von &climb_up.


Danke,
flowdy
Last edited: 2012-11-06 22:48:57 +0100 (CET)
package MyClass; sub new {\b\b\b\b\b\b\b\b\buse Moose;

View full thread Currying in Schleifen