Thanks to Michael's example, I did this other version of the macro:
julia> type Foo{T<:Number}
x::Vector{T}
end
julia> macro foo_op(op)
quote
dot_op = symbol(".$($op)")
docstr = "`$($op)` also works for `Foo` types!"
function Base.$op(a::Foo, b::Foo)
Foo(dot_op(a.x, b.x))
end
@doc Markdown.parse(docstr) Base.$op
Base.$op
end
end
julia> @foo_op ^
^ (generic function with 46 methods)
help?> ^
search: ^ .^
^(x, y)
Exponentiation operator.
^(s, n)
Repeat n times the string s. The repeat function is an alias to this
operator.
julia> "Test "^3
"Test Test Test "
^ also works for Foo types!
El martes, 15 de diciembre de 2015, 10:28:53 (UTC-6), [email protected]
escribió:
>
> 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,
>