> Actually I've found one difference which is especially troublesome: > > irb(main):001:0> def f(&b) b.call; end; def g; f{return 42}+1; end; g > => 43 > irb(main):002:0> def f; yield; end; def g; f{return 42}+1; end; g > => 42 Here's another return/proc/block oddity, though it may just be a side effect of the above. If you run the code below on 1.8.0 you get: trace: [1, 4, 6, 8, 2] but if you make the suggested '&p' -> 'p' changes, you get: trace: [1, 4, 6, 8, 2, 5] So the behaviour of return depends on the history of how the block got to the yielding method, which is odd. -- George def return1(a) a << 1 p = proc { a << 2; return; a << 3 } a << 4 return2(a, &p) # change to p a << 5 end def return2(a, &p) # change to p a << 6 return3(a, &p) a << 7 end def return3(a) a << 8 yield a << 9 end a = [] return1(a) puts "trace: #{a.inspect}"