指示编译器(`: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`的高效基础结构++ 目前失踪。