> but top-level definitions in a module are special.

In what way? Does using @eval also creates "top-level definitions"?

On Tuesday, December 15, 2015 at 12:31:30 PM UTC-5, Erik Schnetter wrote:
>
> Yes, this totally looks as if it should work... but top-level definitions 
> in a module are special. I would use a function that calls eval instead of 
> a macro:
>
> function operator_ops(name)
>     @eval $name(m1::M, m2::M) = M($name(m1.a, m2.a), ($name)(m1.b, m2.b))
> end
>
> operator_ops(:+)
>
> -erik
>
>
> On Tue, Dec 15, 2015 at 11:28 AM, <[email protected] <javascript:>> wrote:
>
>> Hello,
>>
>> I have a type M and I would like to redefine all the operations *, +, -, 
>> / etc. over it. Since it would be everytime the same operations and since I 
>> want my code to be concise I thought about using a macro to define them, 
>> such as:
>>
>> type M
>>     a
>>     b
>> end
>>
>> macro operator_obs(name)
>>     return quote
>>         function $name(m1::M, m2::M)
>>             return M($name(m1.a, m2.a), $name(m1.b, m2.b))
>>         end
>>     end
>> end
>>
>> @operator_obs(+)
>>
>> m1 = M(2.0,3.0)
>> m2 = M(4.0,5.0)
>>
>> +(m1, m2)
>>
>> But this doesn't seem to work. What did I do wrong?
>>
>> Many thanks,
>>
>
>
>
> -- 
> Erik Schnetter <[email protected] <javascript:>> 
> http://www.perimeterinstitute.ca/personal/eschnetter/
>

Reply via email to