Continuations

Folgende Klasse stellt einen Java-ähnlichen Iterator für alle Objekte, die eine 'each' methode haben, bereit.

class Iterator
  def initialize(enum)
    @enum = enum
    @current = nil
    @back = nil

    @enum.each do |el|
      @current = el
      callcc do |cc|
        @next = cc
        if @back then @back.call else return end
      end
    end
    @current = nil
    @back.call if @back
  end

  def hasNext?
    @current != nil
  end

  def next
    last = @current
    callcc do |cc|
      @back = cc
      @next.call if @current
    end
    last
  end
end

iter = Iterator.new(1..3)
while iter.hasNext?
  puts iter.next
end

Ergebnis:
1
2
3

metaprog.rb