Good catch! But a quote-block and :() should be equivalent, right?  Is
this a bug?

The trouble is that my use-case, I have two lines of code and then the
:()-trick doesn't work anymore because it get translated into a quote-block:

julia> eval(:(x=1; module MO end))
ERROR: invalid method definition: not a generic function

On Wed, 2014-01-29 at 21:08, [email protected] wrote:
> 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?
>>

-- 
Sent with my mu4e

Reply via email to