perlによるaccumulator

Matz氏は「Perlのように変数をcloseすると、例えばPaul Grahamのアキュミュレータ例題が実現できないような。」とつぶやきました。
http://twitter.com/yukihiro_matz/status/26687943572
でも実はPGのaccumulatorをaccumulateするページにはperlの実例があります。
http://www.paulgraham.com/accgen.html

perlによるaccumulator


#!/usr/bin/perl -w
use strict;
use Perl6::Say;
sub adder {
my ($n) = @_;
sub {$n += shift}
}

my $adder=adder(5);
map { say $adder->(1) } (0..2);


$perl accumulator.pl
6
7
8

schemeによるaccumulator


(define (foo n)
(lambda (i)
(set! n (+ n i))
n))

(let ([acc (foo 5)])
(for-each
(lambda (i)
(printf "~A\n" (acc 1)))
'(0 1 2)))


$ csi -qb accumulator.scm
6
7
8