From: matz@... (Yukihiro Matsumoto) Date: 2000-01-15T16:40:21+09:00 Subject: [ruby-talk:01143] Re: Continuations... Hi, In message "[ruby-talk:01142] Continuations..." on 00/01/15, Dave Thomas writes: | def scary | callcc { |c| | return c | } | | p "Here we go" | 'xxx' | end | | p "Start" | again = scary | p "Back" | again.call | p "Done" | | |which generates: | | "Start" | "Back" | "Here we go" | "Back" | -:12: undefined method `call' for "xxx":String (NameError) | |Note the scary way that the continuation call both re-enters the |original routine and then exits back out as if it had never been left |(and hence 'again' isn't set, and you get the error). `again' was set. `scary' returns twice. once returns a continuation, then a string 'xxx', which is the value of the last expression. |Continuations are implemented in Ruby by effectively starting a new |thread for the continuation, suspending the original. On the call, the |original thread is resumed, hence the ability to travel back in time. Continuations are implemented by using thread structures. On creating a new continuation, current context, including closure, is copied into internal thread structure. On the call, the saved context is restored by the thread context swtching, hence the ability to travel back in time. |Now if I could only think of a use for them (apart from getting out of |deeply nested routines/loops). Hmm, typical use of the continuations in Scheme is user level threading and global jump, but Ruby already has both features. matz.