#!/usr/bin/perl -w
$recur = 0;
sub loop($) {
    my ($func) = @_;
    sub {
        local $recur = sub {
            my @args = @_;
            sub { $func->(@args); }
        };
        my $ret = $func->(@_);
        while ('CODE' eq ref($ret)) {
           $ret = $ret->(); 
        }
        $ret;
    };
}
Example usage:
my $foo = loop sub {
    my ($n, $a) = @_;
    if ($n == 0) {
        $a;
    }
    else {
        $recur->($n-1, $a*$n);
    }
};
print $foo->(999999,1) . "\n";
 
No comments:
Post a Comment