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