Talking to the compiler (the :meta mechanism)

في بعض الظروف، قد يرغب المرء في تقديم تلميحات أو تعليمات تفيد بأن كتلة معينة من الشيفرة تحتوي على خصائص خاصة: قد ترغب دائمًا في تضمينها، أو قد ترغب في تفعيل تمريرات تحسين المترجم الخاصة. بدءًا من الإصدار 0.4، تمتلك جوليا تقليدًا يمكن من خلاله وضع هذه التعليمات داخل تعبير :meta، والذي يكون عادةً (ولكن ليس بالضرورة) أول تعبير في جسم دالة.

تُنشأ تعبيرات :meta باستخدام الماكرو. كمثال، اعتبر تنفيذ ماكرو @inline:

macro inline(ex)
    esc(isa(ex, Expr) ? pushmeta!(ex, :inline) : ex)
end

هنا، يُتوقع أن يكون ex تعبيرًا يُعرّف دالة. عبارة مثل هذه:

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

يتم تحويله إلى تعبير مثل هذا:

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

Base.pushmeta!(ex, tag::Union{Symbol,Expr}) يضيف :tag إلى نهاية تعبير :meta، مما ينشئ تعبير :meta جديد إذا لزم الأمر.

لاستخدام البيانات الوصفية، يجب عليك تحليل تعبيرات :meta هذه. إذا كان يمكن تنفيذ تطبيقك داخل جوليا، فإن Base.popmeta! مفيدة جدًا: Base.popmeta!(body, :symbol) ستقوم بفحص تعبير body الخاص بالدالة (واحد بدون توقيع الدالة) للعثور على أول تعبير :meta يحتوي على :symbol، واستخراج أي معطيات، وإرجاع مجموعة (found::Bool, args::Array{Any}). إذا لم تحتوي البيانات الوصفية على أي معطيات، أو لم يتم العثور على :symbol، ستكون مصفوفة args فارغة.

لم يتم توفير بنية تحتية ملائمة لتحليل تعبيرات :meta من C++.