Julia: ajouter la macro @callsuper

Créé le 26 août 2016  ·  3Commentaires  ·  Source: JuliaLang/julia

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.

design help wanted speculative

Commentaire le plus utile

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.

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes