おまけ:内部イテレータとの比較可変箇所が複数ならジェネレータのほうがよっぽどきれいfunction fib(){ // 使い方 list($x, $y) = foreach(fib() as $x){ [0, 1]; // 終了条件 while (TRUE) { if ($x >= 100) yield $x; break; list($x, $y) = // ボディ部 [$y, $x+$y]; echo $x, "n"; } };} copyright(c) 2012 kuwata-lab.com all rights reserved.
おまけ:内部イテレータとの比較Rubyでは、1つの無名関数 (ブロック) で「終了条件」と「ボディ部」の両方を指定できる。def fib() // 使い方 x, y = 0, 1 fib {|x| while true // 終了条件 yield x break if x >= 100 x, y = y, x+y // ボディ部 end puts xend } copyright(c) 2012 kuwata-lab.com all rights reserved.
おまけ:「継続 (Continuation)」との比較◆ 継続のほうができることが広い、 ジェネレータはそのサブセット ※◆ 継続はcall stackを丸ごとコピーする ので重い、 ジェネレータはstack flame1つだけなので軽い◆ 継続は理解するのがすーーーっごく難しい、 ジェネレータはわかりやすいし使いやすい※処理系により実装方法は異なる場合がある copyright(c) 2012 kuwata-lab.com all rights reserved.