From: "Brian F. Feldman" Date: 2001-07-23T01:48:40+09:00 Subject: [ruby-talk:18298] Re: NUM2LONG problem :) Dave Thomas wrote: > "Aleksei Guzev" writes: > > > Just now I met a funny problem with NUM2LONG macro. > > > > I've written a line like the following > > > > return NUM2LONG( fn( x ) ); > > > > Function fn has vivid side effect and NUM2LONG calls it twice ( see > > its definition ) :) Do not do like above! > > Patient: Doctor, it hurts when I type this. > > Doctor: Then don't type that. > > > Just call rb_num2long(fn(x)) directly. The definition should be trivially fixed, nonetheless... the rules I've learned for the implementation of macros have been: * if they're meant to be a block of code not returning a value, they should be in "do { code } while (0)" * parameters must be parenthesized in the implementation to allow for arbitrary expressions without operation order interference * all parameters should be evaluated only once. Generally, these are all easy to do and result in much more robust macros that don't break in ways people don't expect. -- Brian Fundakowski Feldman \ FreeBSD: The Power to Serve! / green@FreeBSD.org `------------------------------'