calling eval in a macro doesn't do what you think it does, so it doesn't do what you want
On Sat, Aug 30, 2014 at 5:05 PM, Don MacMillen <don.macmil...@gmail.com> wrote: > Perfect Steve, many thanks for the explanation. But just to be sure I > understand, > the multiple eval of input expression, your begin println("hello"); 3 end > would only > occur during macro expansion? > > Also, just to beat this poor dead horse into the ground, to get the > behavior I wanted, > get rid of the splice, get rid of the splat and pass a single vector > parameter to the > macro and then eval it there. Now that's the behavior I wanted but > performance is > another issue. How would I reason about the relative performance here? > > macro hornervec(x, c) > p = eval(c) > ex = esc(p[end]) > for i = length(p)-1:-1:1 > ex = :($(esc(p[i])) + t * $ex) > end > Expr(:block, :(t = $(esc(x))), ex) > end > > > On Saturday, August 30, 2014 12:42:11 AM UTC-7, Steven G. Johnson wrote: >> >> The answer is related to your splicing questions. What gets passed to >> the macro is not the value of the argument, but rather the symbolic >> expression of the argument. If I didn't use a temporary variable, that >> symbolic expression would get inserted multiple times into the polynomial >> evaluation. This is not what you want because it means the expression >> could be evaluated multiple times. >> >>> >>> Try passing an expression with a side effect and you'll see what I mean: >>> >>> @horner(begin >>> printf("hello") >>> 3 >>> end, 4,5,6,7) >>> >> >> Whoops, I mean println, not printf. And I mean, try passing it to a >> version of horner that does not use a temporary variable. >> >