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)
end
Hier wird erwartet, dass ex
ein Ausdruck ist, der eine Funktion definiert. Eine Aussage wie diese:
@inline function myfunction(x)
x*(x+3)
end
wird in einen Ausdruck wie diesen umgewandelt:
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
end
Base.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++.