主要是介紹一些教程中沒有的使用方式。
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沒有本地作用域的宏,因此該宏定義必須在全局作用域中進行,因此這應該在原始宏可以工作的任何位置都可以工作,即宏定義應該在頂級複合表達式有效的所有相同位置都有效。