(s0)- F ->(s1)- F ->(s2)-[...]
| | |
+---------+---------+--[...]- T ->(accept)
####
sub outer {
my @funcs = (\&f1, \&f2, \&f3, ...);
my $result = 0;
for $f (@funcs) {
$result = $f->();
last if $result;
}
return ($result);
}
####
sub outer {
%trans = _get_transition_table();
my $f = $trans{'start'};
my $result = 0;
do {
$result = $f1->();
my $state = ($result) ? "$f.true" : "$f.false";
$f = $trans{ $state };
} while ($f);
return ($result);
}
sub _get_transition_table {
my $f1 = \&f1;
my $f2 = \&f2;
my $f3 = \&f3;
[...]
return (
"start" => $f1,
"$f1.true" => 0,
"$f1.false" => $f2,
[...]
);
}
####
sub caller {
[yadda yadda]
my $args = [];
do {
$result = $f->($args);
[yadda yadda]
} while ($f);
return ($result);
}
sub as_list {
my $args = shift;
my ($arg1, $arg2, $arg3) = @$args;
@$args = ();
[...]
}
sub as_stack {
my $args = shift;
my $item = pop @$args;
[...]
push @args, $result;
return ([true|false]);
}
sub as_queue {
my $args = shift;
my $item = shift @$args;
[...]
push @args, $result;
return ([true|false]);
}