Talking to the compiler (the :meta mechanism)
Bazı durumlarda, belirli bir kod bloğunun özel özelliklere sahip olduğunu belirtmek için ipuçları veya talimatlar vermek isteyebilirsiniz: her zaman iç içe almak isteyebilir veya özel derleyici optimizasyon geçişlerini etkinleştirmek isteyebilirsiniz. 0.4 sürümünden itibaren, Julia'nın bu talimatların genellikle (ama zorunlu olarak değil) bir fonksiyonun gövdesindeki ilk ifade olan :meta ifadesi içine yerleştirilebileceğine dair bir kuralı vardır.
:meta ifadeleri makrolarla oluşturulur. Örnek olarak, @inline makrosunun uygulanışını düşünün:
macro inline(ex)
esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
endBurada, ex bir fonksiyonu tanımlayan bir ifade olarak beklenmektedir. Böyle bir ifade:
@inline function myfunction(x)
x*(x+3)
endbir ifade haline dönüşür:
quote
function myfunction(x)
Expr(:meta, :inline)
x*(x+3)
end
endBase.pushmeta!(ex, tag::Union{Symbol,Expr}) :tag'ı :meta ifadesinin sonuna ekler, gerekirse yeni bir :meta ifadesi oluşturur.
Meta verilerini kullanmak için bu :meta ifadelerini ayrıştırmanız gerekir. Uygulamanız Julia içinde gerçekleştirilebiliyorsa, Base.popmeta! oldukça kullanışlıdır: Base.popmeta!(body, :symbol) bir fonksiyon body ifadesini (fonksiyon imzası olmayan) :symbol içeren ilk :meta ifadesini tarar, herhangi bir argümanı çıkarır ve (found::Bool, args::Array{Any}) şeklinde bir demet döner. Eğer meta verilerinin herhangi bir argümanı yoksa veya :symbol bulunamazsa, args dizisi boş olacaktır.
Henüz sağlanmamış bir altyapı, C++'dan :meta ifadelerini ayrıştırmak için uygundur.