現在、『On Lisp』が3巡目の終盤に差し掛かっている。でも、いまいち継続を理解できていない。分かり易い解説を見つけたのでPerlに翻訳してみた。(本を読む FizzBuzzとGaucheで学ぶ継続の基礎)
use strict;
use warnings;
sub fizzbuzz {
my ($next, ($n)) = @_;
my $answer = $n % 15 == 0 ? "FizzBuzz"
: $n % 3 == 0 ? "Fizz"
: $n % 5 == 0 ? "Buzz"
: $n;
$next->(\&fizzbuzz, ($n + 1, $answer));
}
sub continuation {
my ($next, ($n, $answer)) = @_;
my $cc = sub {
my ($fun) = @_;
$fun->($answer) if (ref $fun eq 'CODE');
$next->(\&continuation, ($n));
};
}
my @restart = fizzbuzz(\&continuation, (1));
push @restart, $restart[$#restart]->() for 2..100;
$restart[$_]->( sub{ print @_, $_ != $#restart ? '|' : '' } ) for 0..$#restart;
100までのFizzBuzzが表示される。
続きを読む