On Sun, Sep 25, 2016 at 7:25 AM, Marius Millea <mariusmil...@gmail.com> wrote: > I can store a macro to a variable (let use the identity macro "id" as an > example), > > julia> idmacro = macro id(ex) > :($(esc(ex))) > end > @id (macro with 1 method) > > > How can I use this macro now? I can *almost* do it by hand by passing an > expression as an argument and eval'ing the result, but it doesn't work > because there's esc's left,
Assuming this is just for understanding how macros are implemented, you can just construct a microcall expression julia> idmacro = macro id(ex) esc(ex) end @id (macro with 1 method) julia> idmacro(:(1 + 2)) :($(Expr(:escape, :(1 + 2)))) julia> eval(Expr(:macrocall, :idmacro, :(1 + 2))) 3 This is unlikely what you want to do in real code. Side notes, As shown above, you can just do `esc(ex)`, `:($foo)` is equivalent to `foo` You can also use a variable name starts with `@` since that's the syntax that triggers the parsing to a macrocall expression. julia> eval(:($(Symbol("@idmacro")) = idmacro)) @id (macro with 1 method) julia> @idmacro 1 + 2 3 julia> Meta.show_sexpr(:(@idmacro 1 + 2)) (:macrocall, Symbol("@idmacro"), (:call, :+, 1, 2)) You can do this transformation with a macro too (i.e. make @macrocall idmacro 1 + 2 construct a macrocall expression) but it's not really useful since you can't do this for a local variable, which is also why I said don't do this in real code. > > julia> @id 1+2 > 3 > > > julia> idmacro(:(1+2)) > :($(Expr(:escape, :(1 + 2)))) > > > julia> eval(idmacro(:(1+2))) > ERROR: syntax: unhandled expr (escape (call + 1 2)) > in eval(::Module, ::Any) at ./boot.jl:234 > in eval(::Any) at ./boot.jl:233 > > > > Does Julia provide a way to use such macros stored in variables? Thanks!