Talking to the compiler (the :meta
mechanism)
Dans certaines circonstances, on peut souhaiter fournir des indices ou des instructions indiquant qu'un bloc de code donné a des propriétés spéciales : vous pourriez toujours vouloir l'inliner, ou vous pourriez vouloir activer des passes d'optimisation spéciales du compilateur. À partir de la version 0.4, Julia a une convention selon laquelle ces instructions peuvent être placées à l'intérieur d'une expression :meta
, qui est généralement (mais pas nécessairement) la première expression dans le corps d'une fonction.
:meta
expressions sont créées avec des macros. Par exemple, considérons l'implémentation de la macro @inline
:
macro inline(ex)
esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
end
Ici, ex
est censé être une expression définissant une fonction. Une déclaration comme celle-ci :
@inline function myfunction(x)
x*(x+3)
end
se transforme en une expression comme celle-ci :
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
end
Base.pushmeta!(ex, tag::Union{Symbol,Expr})
ajoute :tag
à la fin de l'expression :meta
, créant une nouvelle expression :meta
si nécessaire.
Pour utiliser les métadonnées, vous devez analyser ces expressions :meta
. Si votre implémentation peut être effectuée dans Julia, Base.popmeta!
est très pratique : Base.popmeta!(body, :symbol)
va scanner une expression de corps de fonction (une sans la signature de la fonction) à la recherche de la première expression :meta
contenant :symbol
, extraire les arguments et retourner un tuple (found::Bool, args::Array{Any})
. Si les métadonnées n'avaient pas d'arguments, ou si :symbol
n'a pas été trouvé, le tableau args
sera vide.
Pas encore fourni est une infrastructure pratique pour analyser les expressions :meta
de C++.