There you have it... Zen was never my thing.  So I find the previous two 
comments cryptic.
The macro _seemed_ to be doing what I wanted it to.  Is there some 
documentation that
speaks to calling (or rather not calling) eval from inside a macro?

On Saturday, August 30, 2014 2:15:54 PM UTC-7, John Myles White wrote:
>
> This might need to be part of the Zen of Julia.
>
>  — John
>
> On Aug 30, 2014, at 2:11 PM, Jameson Nash <vtj...@gmail.com <javascript:>> 
> wrote:
>
> 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.ma...@gmail.com 
> <javascript:>> 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. 
>>>
>>
>
>

Reply via email to