Engee 文档

指示编译器(`:meta’机制)

有时可能需要指出给定的代码块具有特殊属性:您可能总是需要嵌入它或包含特殊的编译器优化传递。 自Julia中0.4版本以来,有一个协议,即这些指令可以放在表达式`: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

"基地。普什梅塔!(ex,标签::联合{Symbol,Expr})将':tag’添加到表达式:meta`的末尾,必要时创建一个新的表达式`:meta`。

要使用元数据,有必要分析这些表达式`:meta'。 如果实现可以在Julia中完成,使用’Base相当方便。波普梅塔!. "基地。波普梅塔!(body,:symbol)'扫描函数体表达式(没有函数签名),查找包含:symbol`的第一个`:meta’表达式,提取所有参数,并返回元组'(found::Bool,args::Array{Any})`. 如果元数据不包含参数或找不到':symbol',则’args’数组将为空。

从C解析表达式`:meta`的高效基础结构++ 目前失踪。