1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
# This is a partial implementation of Continuation that only supports
# in-scope, one-shot restore using catch/throw.
class Continuation
class << self
undef new if defined?(Continuation.new)
end
def initialize
@disabled = false
end
def call
throw @tag
end
def yield_once
if @disabled
throw ThreadError, "continuations can not be called from outside their scope"
end
begin
catch(@tag = Object.new) do
yield
end
ensure
@disabled = true
end
end
alias [] call
end
module Kernel
module_function def callcc(&block)
cont = Continuation.alloc
cont.initialize
cont.yield_once(&block)
end
end
|