I have defined a macro called @m.trial which simply escapes its argument and feeds into the @identity macro. The @identity macro is defined as (not escaped at the moment intentionally):
macro identity(x)
x
end
@m.trial a doesn’t work as expected. Lets define a=0 in the Main module.
@m.trial @identity a
gives the error that a is not defined. An inspection with @macroexpand shows that it looks a in the module m. I would assume that since @identity doesn’t escape its argument, one would get Main.a.
If I define the unhygienic_identity macro:
macro unhygienic_identity(x)
esc(x)
end
Now modified trial macro @m.unhygienic_trial works.
Now @m.foreach @unhygienic_identity a works. How exactly macro expansion happens ? I think this question is also related to the fact that escape expressions are not resolved before all macros are expanded. That is, @identity sees :($(Expr(:escape, :a))).
module m
macro trial(x)
quote
@Main.identity $(esc(x))
end
end
macro unhygienic_trial(x)
quote
@Main.unhygienic_identity $(esc(x))
end
end
end