主要是介绍一些教程中没有的使用方式。
1、如何计算定义和调用宏生成Julia表达式
比如要返回:return 表达式
宏扩展是在求值之前完成的,因此当宏扩展在此代码中发生时,块中第一个表达式中宏的定义发生得太晚,无法影响块中第二个表达式的扩展。有一种特殊情况可以满足您的要求::toplevel 顶级表达式类型。这将自动用于模块中的顶级全局表达式,但您可以手动构造此类表达式,如下所示:
ex = Expr(:toplevel,
:(macro m() "return" end),
:(@m())
)
# :($(Expr(:toplevel, :($(Expr(:macro, :(m()), quote
# #= D:\Julia\StringToFunction:157 =#
# "return"
# end))), :(#= D:\Julia\StringToFunction:158 =# @m))))
eval(ex)
#return
由于Julia没有本地作用域的宏,因此该宏定义必须在全局作用域中进行,因此这应该在原始宏可以工作的任何位置都可以工作,即宏定义应该在顶级复合表达式有效的所有相同位置都有效。