> 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}"