Gavin Sinclair said:
Although you put "i = i + 1", when yyou then "goto 120", won't
the previous value of i be restored, as the continuation's tentacles reach
in to the consciousness of the program and find that moment in time?
I think variables follow the scoping rules you are used to.
#===============
IANP&T (I Am Not Penn & Teller) but this thread seems to be imbued
with notions that callcc is 'magical'.
I recommend anyone to re-read the short 'Continuations' section
in PickAxe without imagining that lots of stuff has been omitted :>
The contents of the block are not really tied to the continuation.
It's a syntactical convenience but IM(nuby+)O easy to follow.
The important things are on the edges the block:
callcc { | contname | "value of block" }
#--VV---------CC-------------------------BB-TT
where TT is the transfer point after any CC.call().
A CC.call can be made from inside or outside this block
once the Continuation has been 'defined'.
BB is a normal block <AFAICT> which can be interrupted
(or not) by CC.call() or CC.call("newBB").
The value of the callcc expression (VV) is the value
of the block (if it gets to the end), or the value
of the argument given to CC.call("newBB"), or nil if no
argument is given to CC.call.
Things to watch:
Obviously the variable used for contname (at CC) must
be in scope where you want to call it. If you use a global,
that's sorted :-b
#===============
vv = callcc { 10 }
p vv #-> 10
#===============
vv = callcc { |cc| cc.call; 10 }
p vv #-> nil
#===============
vv = callcc { |cc| cc.call(11); 10 }
p vv #-> 11
#===============
vv = callcc do |cc|
#
cc.call(13) if false
#
puts "blah, blah, stuff" #-> displays this
#
cc.call(12) if true
#
#
puts "blah, blah, loads more"
#
#
cc.call(11)
#
10
end
p vv #-> 12
#===============
The possibilities for use / abuse of this facility
are really quite large.
daz