Julia MacroTools
MacroTools
是 Julia 的一個程式庫,可以大幅簡化編寫 macro 的難度。
using MacroTools expr = :(Expr(A, B)) @capture(expr, T_Symbol(fields__))
上面的程式裡面寫了 :(Expr(A, B))=,意思是 =quote Expr(A, B) end
@capture(expr, T_Symbol(fields__))
這段會去比對 expr
跟右邊的 pattern,如果成功就會生成 T
跟 fields
兩個變數並回傳 true=。=_Symbol
表示 T
一定要是一個
Symbol=,而一個底線 =_
表示只有一個,兩個底線 __
表示多個。有了這些我們就能寫出一個簡單的 data type
macro data(n::Symbol, block::Expr) block = rmlines(block) s = map(expr -> begin @assert @capture(expr, T_Symbol(fields__)) :(struct $(T) <: $(n) $(fields...) end) end, block.args) quote abstract type $(n) end $(s...) end end @data E begin E1() E2(x::Int) end E1() E2(1) E2("") # error: Cannot `convert` an object of type String to an object of type Int64