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
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>

Reply via email to