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}):tag 附加到 :meta 表达式的末尾,如果必要的话会创建一个新的 :meta 表达式。

要使用元数据,您必须解析这些 :meta 表达式。如果您的实现可以在 Julia 中执行,Base.popmeta! 非常方便:Base.popmeta!(body, :symbol) 将扫描一个函数 body 表达式(没有函数签名的表达式),查找第一个包含 :symbol:meta 表达式,提取任何参数,并返回一个元组 (found::Bool, args::Array{Any})。如果元数据没有任何参数,或者没有找到 :symbol,则 args 数组将为空。

尚未提供的是一个方便的基础设施,用于解析 C++ 中的 :meta 表达式。