我正在生成一些代码,该代码稍后将被评估。尽管生成的代码是正确的,并且逐行评估不会导致问题,但它作为一个整体无法被正确评估。
eval(quote
macro m() "return" end
@m()
end)
返回结果:
错误:LoadError: UndefVarError: @m未定义
eval(quote macro m() "return" end end)
eval(@m())
返回:
"return"
我正在生成一些代码,该代码稍后将被评估。尽管生成的代码是正确的,并且逐行评估不会导致问题,但它作为一个整体无法被正确评估。
eval(quote
macro m() "return" end
@m()
end)
错误:LoadError: UndefVarError: @m未定义
eval(quote macro m() "return" end end)
eval(@m())
"return"
ex = Expr(:toplevel,
:(macro m() "return" end),
:(@m())
)
确实,这会做你想要的事情:
julia> eval(ex)
"return"
由于Julia没有局部作用域宏,因此该宏定义必须在全局作用域中进行,因此假定这应该可以在原始宏可以工作的任何地方使用 - 即,宏定义应该在所有相同的位置有效,其中顶级复合表达式是有效的。