原です。

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 は実装
出来そうにない。