14. 1| begin
2| hello
3| rescue Exception => e
4| e.restart
5| ensure
6| e.cleanup
7| end
15. 1| def hello
3| i = 0
4| restartable do
5| puts i += 1
6| raise Exception unless i == 5
7| end
8| end
16. 1| def restartable
2| cont = callcc { |c| c }
3| begin
4| yield
5| rescue Exception => e
6| e.continuation = cont
7| raise e
8| end
9| end
17. require 'continuation'
class Exception
class << self
attr_accessor :conts
end
def continuation=(cont)
self.class.conts ||= {}
self.class.conts[self.class] ||= cont
end
18. def restart
self.class.conts[self.class].call
end
def cleanup
self.class.conts.delete(self.class)
end
end
19. You can do with continuation:
Generator objects
Fibers/Coroutines
Exit from recursion
Other control structures