フィボナッチ数列、もっと
おとといのフィボナッチ数列の続きです。id:sumimさんが、call/cc を使ったコルーチンもどきでフィボナッチ数列という楽しいプログラムを書いていらしたので、便乗させていただきました。
違うところは、callccで保存する環境を直接ローカル変数にしたのと、あちこちリネームしたのと、元のresumeというprocをインライン展開したのと、unlessを修飾子にした点です。
fib_loopのほうはフィボナッチ数列を作り出す無限ループになっていて、fib_nextを呼び出す20.timesのループと協調しながら(コルーチン的)動いています。
# Based on http://d.hatena.ne.jp/sumim/20060417/p1 continue = output = nil fib_loop = proc {|a, b| loop { callcc {|continue| output.call(a) } a, b = b, a + b } } fib_next = proc { callcc {|output| fib_loop.call(1, 1) unless continue continue.call } } 20.times do print fib_next.call, " " end #=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765