Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

You can implement coroutines with continuations with two functions:

    def resume
      callcc do |cc|
        $current = self
        @caller = cc
        @resumer.call
      end
    end
    
    def self.yield
      callcc do |cc|
        $current.resumer = cc
        $current.caller.call(cc)
      end
    end
`resume` (on a coro) will store what coroutine we're entering (globally) and the caller-continuation (so we know where to go to after Coro.yield). It will then invoke the `resumer`-continuation. `Coro.yield` will store the `resumer`-continuation on the coro (so we know where to go to after `.resume`).

You need something to kick it off though. The simplest way is probably to use `(@resumer || @code).call`.



Nice! I've already given my invites away though, sorry :(




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: