如何评估定义和调用宏的Julia表达式?

5

我正在生成一些代码,该代码稍后将被评估。尽管生成的代码是正确的,并且逐行评估不会导致问题,但它作为一个整体无法被正确评估。

eval(quote
  macro m() "return" end
  @m()
end)

返回结果:

错误:LoadError: UndefVarError: @m未定义

eval(quote macro m() "return" end end)
eval(@m())

返回: "return"
1个回答

6
宏展开在求值之前完成,因此当宏展开发生在该代码中时,在块中第一个表达式中的宏定义发生得太晚,无法影响到块中第二个表达式的展开。有一种特殊情况可以实现你想要的效果:`:toplevel` 表达式类型。这在模块中用于顶层全局表达式,但你也可以手动构造这种类型的表达式,就像这样:
ex = Expr(:toplevel,
    :(macro m() "return" end),
    :(@m())
)

确实,这会做你想要的事情:

julia> eval(ex)
"return"

由于Julia没有局部作用域宏,因此该宏定义必须在全局作用域中进行,因此假定这应该可以在原始宏可以工作的任何地方使用 - 即,宏定义应该在所有相同的位置有效,其中顶级复合表达式是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接