Talking to the compiler (the :meta
mechanism)
En algunas circunstancias, uno podría desear proporcionar pistas o instrucciones de que un bloque de código dado tiene propiedades especiales: podrías querer siempre incluirlo en línea, o podrías querer activar pases de optimización especiales del compilador. A partir de la versión 0.4, Julia tiene una convención de que estas instrucciones pueden colocarse dentro de una expresión :meta
, que es típicamente (pero no necesariamente) la primera expresión en el cuerpo de una función.
Las expresiones :meta
se crean con macros. Como ejemplo, considera la implementación de la macro @inline
:
macro inline(ex)
esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
end
Aquí, ex
se espera que sea una expresión que define una función. Una declaración como esta:
@inline function myfunction(x)
x*(x+3)
end
se convierte en una expresión como esta:
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
end
Base.pushmeta!(ex, tag::Union{Symbol,Expr})
agrega :tag
al final de la expresión :meta
, creando una nueva expresión :meta
si es necesario.
Para usar los metadatos, debes analizar estas expresiones :meta
. Si tu implementación se puede realizar dentro de Julia, Base.popmeta!
es muy útil: Base.popmeta!(body, :symbol)
escaneará una expresión de cuerpo de función (una sin la firma de la función) en busca de la primera expresión :meta
que contenga :symbol
, extraerá cualquier argumento y devolverá una tupla (found::Bool, args::Array{Any})
. Si los metadatos no tenían argumentos, o :symbol
no se encontró, el array args
estará vacío.
Aún no se ha proporcionado una infraestructura conveniente para analizar expresiones :meta
de C++.