> harp:~ > cat a.rb > def myfunc *a, &b > x = a.shift || b.call > Math.sin(x) * Math.cos(x) * Math.exp(x) > end That's got the same problem - rand will only be evaluated once, what you were no doubt after is: def myfunc *a, &b b ||= proc { a.first } Math.sin(b.call) * Math.cos(b.call) * Math.exp(b.call) end But the point remains, anything macros do, functions or metaprogramming do better. Dan.