Enumerable#take
列挙子が与えられたときに終了しない理由を理解するのに苦労しています:
require 'continuation'
fib = Enumerator.new do |yielder|
c, x, y = callcc {|cc| [cc, 0, 1]}
yielder << x
c.call c, y, x+y
end
# this works as I'd suspect
1.upto(10) do
puts fib.next
end
# this works as I'd suspect
fib.take(1)
# this never terminates :(
fib.take(10)
enum.cをざっと見てみると、おそらくargs[1]のカウンターが要求された最初の長さにリセットされ、反復が2019行で終了しないように見えます。私の理解では、列挙子の内部ファイバーが (でyielder << x
)降伏したときにスタックを復元する必要c.call ...
があるため、問題になることはありません (一時的args[1]
に元の長さの引数に戻っているにもかかわらず)...しかし、それはそうではないようです場合があります。
fib.take(n)
一部の n > 1 で終了しない理由を誰か説明できますか? callcc
私がおそらくここで見逃している仕組みについての基本的なことはありますか?
注:これは Ruby 1.9.3 に関するものです。そして、はい、私の使用法はちょっとcallcc
ばかげていることに気づきました:)。