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