def level3(cont) cont.call("RETURN THIS") end def level2(cont) level3(cont) return "NEVER RETURNED" end def top_level_function callcc { |cc| level2(cc) } end answer = top_level_function puts answer
# $Id: callcc1.ses,v 1.1 2003/11/30 12:32:45 radek Exp $def level3(cont)
cont.call("RETURN THIS")
end
nil
def level2(cont)
level3(cont)
return "NEVER RETURNED"
end
nil
def top_level_function
callcc { |cc|
level2(cc)
}
end
nil
answer = top_level_function
"RETURN THIS"
puts answer
RETURN THIS
nil
# Setup the call with the top level continuations. Notice that we # create two continuations in this function. The outer-most one # (+ret+) is the normal return. The inner continuation (+failed+) # is designed to indicate failure by returning a -1 from the top # level function def chop_with_cc(target, list) callcc { |ret| callcc { |failed| sub_chop_with_cc(target, list, ret, failed) } -1 } end # Recursive helper function with continuations explicitly passed in. def sub_chop_with_cc(target, list, found, not_found) if list.size <= 1 (list[0] == target) ? found.call(0) : not_found.call else mid = list.size/2 if list[mid] > target sub_chop_with_cc( target, list[0...mid], found, not_found) else found.call( mid + callcc { |cc| sub_chop_with_cc( target, list[mid..-1], cc, not_found) } ) end end end class TestChopContinuations < Test::Unit::TestCase alias chop chop_with_cc include ChopTests end