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]> 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]>
http://www.perimeterinstitute.ca/personal/eschnetter/