You are simply computing using a vectorization of the horner macro:
julia> c=1; @horner 0.7 c c c
2.19
julia> c=2; @horner 0.7 c c c
4.38
julia> c=3; @horner 0.7 c c c
6.569999999999999
julia> c=4; @horner 0.7 c c c
8.76
julia> c=5; @horner 0.7 c c c
10.95
julia> macroexpand(:( @horner 0.7 c c c ))
quote
t = 0.7
c + t * (c + t * c)
end
On Sat, Aug 30, 2014 at 12:15 AM, Don MacMillen <[email protected]>
wrote:
> So then I'm confused (no wait, maybe I'm not). If c is just the
> symbol :c in the macro, why do we have the following? I am
> just trying to understand.
>
> julia> @horner(.7, c)
> 5-element Array{Float64,1}:
> 1.0
> 2.0
> 3.0
> 4.0
> 5.0
>
> julia> @horner(.7, c, c, c)
> 5-element Array{Float64,1}:
> 2.19
> 4.38
> 6.57
> 8.76
> 10.95
>
>
>
> On Friday, August 29, 2014 9:06:00 PM UTC-7, Jameson wrote:
>
>> in `@macro` context `c` is not iterable, it is a symbol (a literal 'c').
>> when the horner macro is evaluated, `c` doesn't have a value, just the
>> expression `:c` – this difference is what differentiates a macro from a
>> function.
>>
>>
>> On Sat, Aug 30, 2014 at 12:02 AM, Don MacMillen <[email protected]>
>> wrote:
>>
>>> Oops typo in last responce, I meant.
>>>
>>>
>>> julia> @horner(.75, c...)
>>> ERROR: unsupported or misplaced expression ...
>>>
>>> julia>
>>>
>>> On Friday, August 29, 2014 9:00:10 PM UTC-7, Don MacMillen wrote:
>>>>
>>>> Ah, well that was perhaps a bad example. My understanding was the
>>>> you could interpolate an interable. Consider then the horner macro
>>>>
>>>> macro horner(x, p...)
>>>> 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
>>>>
>>>> if I have a vector of constant coefficients, shouldn't I be able to
>>>> splice
>>>> them into the macro call?
>>>>
>>>> julia> c = [1.:5]
>>>> 5-element Array{Float64,1}:
>>>> 1.0
>>>> 2.0
>>>> 3.0
>>>> 4.0
>>>> 5.0
>>>>
>>>> julia> @horner(.x, c...)
>>>> ERROR: syntax: invalid identifier name "."
>>>>
>>>>
>>>>
>>>> On Friday, August 29, 2014 8:45:00 PM UTC-7, Jameson wrote:
>>>>>
>>>>> that would be utterly pointless, since you can already just write:
>>>>> @mymacro(“aaa”, “bbb”, “ccc”)
>>>>>
>>>>> if you are intending to look at values, you should be using a
>>>>> function. a macro is a function but it's also special in that it takes the
>>>>> quoted AST of it’s arguments during parsing, not their values during
>>>>> runtime
>>>>>
>>>>> observe when b... is getting printed:
>>>>>
>>>>> julia> macro mymacro(a,b)
>>>>> println(b)
>>>>> end
>>>>>
>>>>> julia> f() = @mymacro(a,b...)
>>>>> b...
>>>>> f (generic function with 1 method)
>>>>>
>>>>> julia> f()
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Aug 29, 2014 at 9:45 PM, Don MacMillen <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> I meant something like this
>>>>>>
>>>>>> julia> macro mymacro(a,b,c)
>>>>>> println(c)
>>>>>> end
>>>>>>
>>>>>> julia> @mymacro("aaa", ("bbb", "ccc")...)
>>>>>> ERROR: wrong number of arguments
>>>>>>
>>>>>> which works fine for functions
>>>>>>
>>>>>> julia> function myfunc(a,b,c)
>>>>>> println(c)
>>>>>> end
>>>>>> myfunc (generic function with 1 method)
>>>>>>
>>>>>> julia> myfunc("aaa", ("bbb", "ccc")...)
>>>>>> ccc
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Friday, August 29, 2014 6:02:45 PM UTC-7, Jameson wrote:
>>>>>>
>>>>>>> splicing into a macro works for me:
>>>>>>>
>>>>>>> julia> macro mymacro(a,b)
>>>>>>> println(b)
>>>>>>> end
>>>>>>>
>>>>>>> julia> @mymacro(x, y...)
>>>>>>> y...
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Aug 29, 2014 at 8:57 PM, Don MacMillen <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> The slides are great. Many thanks for sharing.
>>>>>>>>
>>>>>>>> I do have a question about macros that maybe you can answer. In
>>>>>>>> your nb on
>>>>>>>> metaprogramming you have the horner macro listed and it uses a
>>>>>>>> temporary
>>>>>>>> variable t. But this macro can be written without using a
>>>>>>>> temporary variable.
>>>>>>>> It turns out to be slower (the no temp version) if we are computing
>>>>>>>> a bunch of
>>>>>>>> polynomials with the same coefficients, but is a tiny bit faster if
>>>>>>>> the coefficients
>>>>>>>> are always changing. So are the Expr's cached? Or is something else
>>>>>>>> going on?
>>>>>>>>
>>>>>>>> Also (OK I have two questions) it looks like we cannot splice into
>>>>>>>> a macro call?
>>>>>>>> Ie @mymacro(x, y...) doesn't work?
>>>>>>>>
>>>>>>>> Thanks again.
>>>>>>>>
>>>>>>>> Don
>>>>>>>>
>>>>>>>>
>>>>>>>> On Friday, August 29, 2014 4:08:44 AM UTC-7, Steven G. Johnson
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> I just gave a talk on Julia at EuroSciPy, and managed to escape
>>>>>>>>> alive. :-)
>>>>>>>>>
>>>>>>>>> I think they will post a video at some point, but in the meantime
>>>>>>>>> the slides and IJulia notebooks are posted at:
>>>>>>>>>
>>>>>>>>> https://github.com/stevengj/Julia-EuroSciPy14
>>>>>>>>>
>>>>>>>>> --SGJ
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>