Advertisement
Guest User

Untitled

a guest
Sep 27th, 2012
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 0.80 KB | None | 0 0
  1. require 'continuation'
  2.  
  3. def reset &ff
  4.   call_stk = []
  5.   last = lambda { |x| call_stk.pop[x] }
  6.   store = lambda { |f| callcc {|cc| call_stk.push(cc); f.call() } }
  7.   shift = lambda do |&f|
  8.     store[ ->{
  9.       k = call_stk.pop
  10.       last[ f.call(->(x){ store[ ->{ last[k[x]] } ] }) ]
  11.     } ]
  12.   end
  13.   store[->{ last[ff[shift]] }]
  14. end
  15.  
  16. # e.g...
  17.  
  18. reset do |shift|
  19.   print 'D'
  20.   shift.call do |k|
  21.     k[k]
  22.     print 'E'
  23.     print 'D'
  24.   end
  25.   shift.call do |k|
  26.     print 'E'
  27.     k[k]
  28.     print 'T'
  29.   end
  30.   print 'L'
  31.   shift.call do |k|
  32.     print 'I'
  33.     k[k]
  34.     print 'M'
  35.     k[k]
  36.     print 'I'
  37.   end
  38. end
  39. puts
  40.  
  41.  
  42. puts "7+1+1+1=#{reset { |shift| 1+shift.call{|k| k[k[k[7]]] } }}"
  43.  
  44. lambda do
  45.   k = reset {|shift| 1+shift.call {|kk| kk }}
  46.   puts "#{k[1]}, #{k[k[1]]}"
  47. end.call
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement