Talking to the compiler (the :meta mechanism)
In einigen Fällen möchte man möglicherweise Hinweise oder Anweisungen geben, dass ein bestimmter Codeblock besondere Eigenschaften hat: Man möchte ihn möglicherweise immer inline einfügen oder spezielle Compiler-Optimierungspässe aktivieren. Seit Version 0.4 hat Julia eine Konvention, dass diese Anweisungen innerhalb eines :meta-Ausdrucks platziert werden können, der typischerweise (aber nicht unbedingt) der erste Ausdruck im Körper einer Funktion ist.
:meta-Ausdrücke werden mit Makros erstellt. Als Beispiel betrachten wir die Implementierung des @inline-Makros:
macro inline(ex)
esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
endHier wird erwartet, dass ex ein Ausdruck ist, der eine Funktion definiert. Eine Aussage wie diese:
@inline function myfunction(x)
x*(x+3)
endwird in einen Ausdruck wie diesen umgewandelt:
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
endBase.pushmeta!(ex, tag::Union{Symbol,Expr}) fügt :tag am Ende des :meta-Ausdrucks hinzu und erstellt einen neuen :meta-Ausdruck, falls erforderlich.
Um die Metadaten zu verwenden, müssen Sie diese :meta-Ausdrücke parsen. Wenn Ihre Implementierung in Julia durchgeführt werden kann, ist Base.popmeta! sehr nützlich: Base.popmeta!(body, :symbol) durchsucht einen Funktions body-Ausdruck (einen ohne die Funktionssignatur) nach dem ersten :meta-Ausdruck, der :symbol enthält, extrahiert alle Argumente und gibt ein Tupel (found::Bool, args::Array{Any}) zurück. Wenn die Metadaten keine Argumente hatten oder :symbol nicht gefunden wurde, ist das args-Array leer.
Noch nicht bereitgestellt ist eine praktische Infrastruktur zum Parsen von :meta-Ausdrücken aus C++.