# -*- coding: utf-8 -*- def reset callcc do |c| old_mc = Thread.current[:mc] Thread.current[:mc] = lambda do |v| Thread.current[:mc] = old_mc c.call(v) end v = yield Thread.current[:mc].call(v) end end def shift callcc do |c| v = yield(lambda do |v2| reset do c.call(v2) end end) Thread.current[:mc].call(v) end end def procedure proc do |*args| cur_c = reset do yield end args.each do |arg| cur_c = cur_c.call(arg) end cur_c end end def _ shift do |c| c end end hello = procedure do puts("Hello #{_}, I am #{_}.") end hello.call('Rubyists', 'a novice Haskeller') hello.call('Haskellers', 'a novice Rubyist')