Julia: @callsuper-Makro hinzufügen

Erstellt am 26. Aug. 2016  ·  3Kommentare  ·  Quelle: JuliaLang/julia

Gemäß https://github.com/JuliaLang/julia/pull/13123 könnten wir ein @supercall Makro hinzufügen, das die Benutzeroberfläche zu invoke versüßt und intuitiver macht. Meine aktuelle Umsetzung:

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

Unterstützung für Schlüsselwortargumente kann https://github.com/JuliaLang/julia/pull/11165 entnommen werden

design help wanted speculative

Hilfreichster Kommentar

Oder vielleicht könnte <strong i="5">@invoke</strong> foo(x, y::T) in invoke(foo, (typeof(x), T), x,y) , dh Sie könnten typeasserts verwenden, um die gewünschte Rufsignatur anzugeben.

Alle 3 Kommentare

Müssen die in invoke verwendeten Typen tatsächlich Supertypen der bereitgestellten Werte sein?

Oder vielleicht könnte <strong i="5">@invoke</strong> foo(x, y::T) in invoke(foo, (typeof(x), T), x,y) , dh Sie könnten typeasserts verwenden, um die gewünschte Rufsignatur anzugeben.

Als neues Feature kann Post-1.0 betrachtet werden. Triage hält es auch für unwahrscheinlich, dass wir invoke für 1.0 entfernen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

thofma picture thofma  ·  3Kommentare

dpsanders picture dpsanders  ·  3Kommentare

TotalVerb picture TotalVerb  ·  3Kommentare

musm picture musm  ·  3Kommentare

StefanKarpinski picture StefanKarpinski  ·  3Kommentare