Lambda Closure at Perl Design Patterns Wiki
http://perldesignpatterns.com/?lambdaclosure
Perl のレキシカル変数で lazy evaluation
レキシカル変数は関数呼び出しのたび生成され、それを参照するスコープが消滅するまで残る。
do {
my $head = sub {};
sub add_link {
my $link = shift;
my $next = $head;
$head = sub { $next->(@_); $link->(@_) };
}
sub run_links {
$head->(@_);
}
};
add_link sub{print "> @_\n"};
add_link sub{print "< @_\n"};
run_links('hello', 'world');
とやると、
と出る。
引数が格納される配列 @_ はレキシカルじゃないので、
関数ごとに独立している。(内側の関数から、外側の関数の@_は見えない)
(だから引数をまるごと渡して処理を委譲するときに、引数が長すぎると遅い…)
これは関数呼び出しだけを lazy に評価しているけれど、
tie を活用すれば変数参照も lazy にできるような気が。