وفقًا لـ https://github.com/JuliaLang/julia/pull/13123 ، يمكننا إضافة ماكرو @supercall
يحلّ الواجهة إلى invoke
ويجعلها أكثر سهولة. تطبيقي الحالي:
macro callsuper(ex)
ex.head == :call || error("<strong i="9">@invoke</strong> requires a call expression")
args = ex.args[2:end]
types = Symbol[]
vals = Symbol[]
blk = quote end
for arg in args
val = gensym()
typ = gensym()
push!(vals, val)
push!(types, typ)
if isa(arg,Expr) && arg.head == :(::) && length(arg.args) == 2
push!(blk.args, :($typ = $(esc(arg.args[2]))))
push!(blk.args, :($val = $(esc(arg.args[1]))::$typ))
else
push!(blk.args, :($val = $(esc(arg))))
push!(blk.args, :($typ = typeof($val)))
end
end
push!(blk.args, :(invoke($(esc(ex.args[1])), ($(types...),), $(vals...))))
return blk
end
يمكن الحصول على دعم وسائط الكلمات الرئيسية من https://github.com/JuliaLang/julia/pull/11165.
هل يجب أن تكون الأنواع المستخدمة في الاستدعاء أنواعًا فائقة من القيم المقدمة؟
أو ربما يتحول <strong i="5">@invoke</strong> foo(x, y::T)
إلى invoke(foo, (typeof(x), T), x,y)
، على سبيل المثال ، يمكنك استخدام أدوات الكتابة للإشارة إلى توقيع المكالمة المطلوب.
كميزة جديدة ، يمكن اعتبارها post-1.0. يشعر الفرز أيضًا أنه من غير المحتمل أن نزيل invoke
مقابل 1.0.
التعليق الأكثر فائدة
أو ربما يتحول
<strong i="5">@invoke</strong> foo(x, y::T)
إلىinvoke(foo, (typeof(x), T), x,y)
، على سبيل المثال ، يمكنك استخدام أدوات الكتابة للإشارة إلى توقيع المكالمة المطلوب.