我正在生成一些代码,稍后将对其进行评估。即使生成的代码是正确的,并且逐行对其进行评估也不会引起问题,但仍无法整体正确地对其进行评估。

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

返回值:ERROR: LoadError: UndefVarError: @m not defined
eval(quote macro m() "return" end end)
eval(@m())

返回:"return"

最佳答案

宏扩展是在求值之前完成的,因此,在此代码中发生宏扩展时,块中第一个表达式中的宏定义发生得太迟而无法影响块中第二个表达式的扩展。有一种特殊情况可以满足您的需求::toplevel表达式类型。这会自动用于模块中的顶级全局表达式,但是您可以像下面这样手动构造这种类型的表达式:

ex = Expr(:toplevel,
    :(macro m() "return" end),
    :(@m())
)

确实,这可以满足您的需求:
julia> eval(ex)
"return"

由于Julia没有本地范围的宏,因此该宏定义必须已经在全局范围内进行,因此大概可以在原始宏可以使用的任何地方使用,即宏定义在顶级复合表达式有效的所有相同位置均应有效。

关于julia - 如何评估Julia定义和调用宏的表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58114237/

10-11 22:25
查看更多