>>55
前スレ869ですが元となったコードを完全に乗せると以下の様な物になります。
DSLのメソッドチェーンをreduceで処理しようとしていました。
具体的に言うとfn(a)(b)(c)というシンタックスを(fn, a, b, c)に正規化し
fnをaに適用しその返り値をbに適用しその返り値をcに適用するという処理です。
これはまさにreduceの出番だと合点したものでしたが
猫を電子レンジで乾かすようなものだったのですね。

return reduce {
my ($func, $argv) = ($a, $b);

my @evaled_argv = eval_argv($argv);
my $env = []; # reduceの中はスコープがきられない
my $lexical_table = {};
my $arg_set;

my $closure = my_eval($func);
my $func_body = str_to_show($closure->[1]);
@{$env} = (@{$closure->[2]}, $lexical_table);
push @envs, $env;

my $i=0;
for (@evaled_argv) {
$envs[-1][-1]{"_ARG$i"} = $_;
$i++;
}

my $result = my_eval($func_body, "text");
pop @envs;
$result
} @normalized;