Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'continuation'
- def reset &ff
- call_stk = []
- last = lambda { |x| call_stk.pop[x] }
- store = lambda { |f| callcc {|cc| call_stk.push(cc); f.call() } }
- shift = lambda do |&f|
- store[ ->{
- k = call_stk.pop
- last[ f.call(->(x){ store[ ->{ last[k[x]] } ] }) ]
- } ]
- end
- store[->{ last[ff[shift]] }]
- end
- # e.g...
- reset do |shift|
- print 'D'
- shift.call do |k|
- k[k]
- print 'E'
- print 'D'
- end
- shift.call do |k|
- print 'E'
- k[k]
- print 'T'
- end
- print 'L'
- shift.call do |k|
- print 'I'
- k[k]
- print 'M'
- k[k]
- print 'I'
- end
- end
- puts
- puts "7+1+1+1=#{reset { |shift| 1+shift.call{|k| k[k[k[7]]] } }}"
- lambda do
- k = reset {|shift| 1+shift.call {|kk| kk }}
- puts "#{k[1]}, #{k[k[1]]}"
- end.call
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement