現在、『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を挟んで再帰呼び出し $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)); }; } # 1〜100のfizzbuzz継続を生成してリストに保存 my @restart = fizzbuzz(\&continuation, (1)); push @restart, $restart[$#restart]->() for 2..100; # 1〜100のfizzbuzz継続を実行 $restart[$_]->( sub{ print @_, $_ != $#restart ? '|' : '' } ) for 0..$#restart;
100までのFizzBuzzが表示される。
続きを読む