From: Brian Candler Date: 2007-03-12T17:47:26+09:00 Subject: Re: #define alternative for Ruby On Mon, Mar 12, 2007 at 05:16:08PM +0900, Sebastian Hungerecker wrote: > ara.t.howard@noaa.gov wrote: > > On Mon, 12 Mar 2007, Mike wrote: > > > I was talking more about macros rather then constants. But I agree that > > > constant are convenient way to substitute "#define myconst 15". But can > > > you substitute "#define myfunc(x) (sin(x)*cos(x)*exp(x))"? You should > > > know that "x" could be as much other functions as a constant/variable. > > > > perhaps i'm being dense, but i fail to see how the above example is none > > other than a simple function in ruby: > > Imagine you would call the function with rand() as parameter. With #define > rand would be called three times, with def it would be called once and its > value would be used three times. ??? irb(main):001:0> def myfunc(x); Math.sin(x)*Math.cos(x)*Math.exp(x); end => nil irb(main):002:0> p myfunc(rand) 0.44720293351854 => nil irb(main):003:0> p myfunc(rand) 1.07121692170638 => nil irb(main):004:0> p myfunc(rand) 1.01827292445777 => nil Now, if you *store* the value of rand within the function, that's a different case. But Ruby has different idioms for deferred execution: one of those is class Foo def initialize(&blk) @gen = blk end def value @gen.call end end a = Foo.new { rand } puts a.value puts a.value puts a.value