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)
end

Burada, ex bir fonksiyonu tanımlayan bir ifade olarak beklenmektedir. Böyle bir ifade:

@inline function myfunction(x)
    x*(x+3)
end

bir ifade haline dönüşür:

quote
    function myfunction(x)
        Expr(:meta, :inline)
        x*(x+3)
    end
end

Base.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.