原です。
In message "[ruby-list:13565] Re: iterator <-> cursor (Re: iterator for Dummies)"
on 99/04/10, Inaba Hiroto <inaba / st.rim.or.jp> writes:
|すみません、訂正です。
|> def next
|> return nil if @finished
|> @cont.call if @cont
|>
|> @iter.call {|obj|
|> callcc{|@cont| return obj }
|> }
|>
|> @finished = true
|+ nil
|> end
重箱のすみですが、最後に nil を返してくれるってことは、
@finished っていらなんじゃないかな。つまり
class Cursor
def initialize(iter)
@iter = iter
@cont = nil
end
def next
@cont.call if @cont
@iter.call {|obj|
callcc{|@cont| return obj }
}
nil
end
end
c = Cursor.new([1,2,3].method(:each))
while obj = c.next
p obj
end
でいいのでは。
しかし、私、始めて call/cc の役に立つ例を見た気がします。昔
call/cc がわからなくて scheme を放り投げた経験があるのだけど
まさか ruby で分かるようになるとは。ありがとう稲葉さん、前田
さん。(^^
ところで、みなさん今回の外部イテレータの例で、
obj1 = c.next, obj2 = c.next, obj3 = c.next, ...
みたいな書き方をしていますが、pop とか shift とか get
の方がしっくりしません?カーソルっぽくないけど。
next の語感からすると、
obj2 = obj1.next, obj3 = obj2.next, obj4 = obj3.next, ...
となればありがたいですね。しかし、一般にはこの next は実装
出来そうにない。