UP | HOME

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,如果成功就會生成 Tfields 兩個變數並回傳 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
Date: 2021-12-11 Sat 00:00
Author: Lîm Tsú-thuàn