Talking to the compiler (the :meta
mechanism)
特定の状況下では、特定のコードブロックが特別な特性を持っていることを示すヒントや指示を提供したい場合があります。常にインライン化したい場合や、特別なコンパイラ最適化パスを有効にしたい場合があります。バージョン0.4から、Juliaにはこれらの指示を :meta
表現の中に置くという慣習があります。これは通常(必ずしもそうではありませんが)関数の本体の最初の表現です。
:meta
表現はマクロを使って作成されます。例として、@inline
マクロの実装を考えてみましょう:
macro inline(ex)
esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
end
ここで、ex
は関数を定義する式であることが期待されています。このような文:
@inline function myfunction(x)
x*(x+3)
end
このような表現に変わります:
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
end
Base.pushmeta!(ex, tag::Union{Symbol,Expr})
は :meta
式の末尾に :tag
を追加し、必要に応じて新しい :meta
式を作成します。
メタデータを使用するには、これらの :meta
表現を解析する必要があります。実装がJulia内で行える場合、Base.popmeta!
は非常に便利です:Base.popmeta!(body, :symbol)
は関数の body 表現(関数シグネチャのないもの)をスキャンし、最初の :meta
表現を見つけて :symbol
を含むものを抽出し、引数を取得してタプル (found::Bool, args::Array{Any})
を返します。メタデータに引数がなかった場合や :symbol
が見つからなかった場合、args
配列は空になります。
まだ提供されていないのは、C++から:meta
式を解析するための便利なインフラストラクチャです。