The problem seems to have to do with it getting wrapped in a quote block.

~~~
julia> quote module MO end end
quote  # none, line 1:
    $(Expr(:module, true, :MO, quote
        eval(x) = top(Core).eval(MO,x)
        eval(m,x) = top(Core).eval(m,x)
    end))
end

julia> :(module MO end)
:($(Expr(:module, true, :MO, quote
        eval(x) = top(Core).eval(MO,x)
        eval(m,x) = top(Core).eval(m,x)
    end)))

julia> eval(quote module MO end end)
ERROR: invalid method definition: not a generic function

julia> eval(:(module MO end))
Warning: replacing module MO
~~~


On Wed, Jan 29, 2014 at 2:13 PM, Mauro <[email protected]> wrote:

> As far as I can tell, below macro is the identity-macro and works for
> everything I tried but for module definitions.  Why?  In fact, I
> struggle to get a module definition working within a macro.
>
>     julia> macro id(ex)
>                :($(esc(ex)))
>            end
>
>     julia> @id x=5
>     5
>     julia> @id type MT end
>
>     julia> @id module MO end
>     ERROR: invalid method definition: not a generic function
>
> Second example:
>
>     macro typ(ex) # this works and produces type TY
>         :(esc(type TY end))
>     end
>
>     macro mod(ex) # this doesn't
>         :(esc(module MO end))
>     end
>
>     ERROR: syntax: malformed module expression
>
> Is there a way to define modules within macros?
>

Reply via email to