Selon https://github.com/JuliaLang/julia/pull/13123 , nous pourrions ajouter une macro @supercall
qui adoucit l'interface à invoke
et la rend plus intuitive. Mon implémentation actuelle :
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
La prise en charge des arguments de mots clés peut être extraite de https://github.com/JuliaLang/julia/pull/11165.
les types utilisés dans invoke doivent-ils réellement être des supertypes des valeurs fournies ?
Ou peut-être que <strong i="5">@invoke</strong> foo(x, y::T)
pourrait se transformer en invoke(foo, (typeof(x), T), x,y)
, c'est-à-dire que vous pourriez utiliser des affirmations de type pour indiquer la signature d'appel souhaitée.
En tant que nouvelle fonctionnalité, peut être considéré comme post-1.0. Triage pense également qu'il est peu probable que nous supprimions invoke
pour 1.0.
Commentaire le plus utile
Ou peut-être que
<strong i="5">@invoke</strong> foo(x, y::T)
pourrait se transformer eninvoke(foo, (typeof(x), T), x,y)
, c'est-à-dire que vous pourriez utiliser des affirmations de type pour indiquer la signature d'appel souhaitée.