[#1026] Is this a bug? — Dave Thomas <Dave@...>

18 messages 2000/01/03

[#1084] Infinite loop — Dave Thomas <Dave@...>

17 messages 2000/01/11

[#1104] The value of while... — Dave Thomas <Dave@...>

24 messages 2000/01/11

[ruby-talk:01143] Re: Continuations...

From: matz@... (Yukihiro Matsumoto)
Date: 2000-01-15 07:40:21 UTC
List: ruby-talk #1143
Hi,


In message "[ruby-talk:01142] Continuations..."
    on 00/01/15, Dave Thomas <Dave@thomases.com> 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.

In This Thread