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.