Julia: añadir macro @callsuper

Creado en 26 ago. 2016  ·  3Comentarios  ·  Fuente: JuliaLang/julia

Según https://github.com/JuliaLang/julia/pull/13123 , podríamos agregar una macro @supercall que endulza la interfaz a invoke y la hace más intuitiva. Mi implementación actual:

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

El soporte para argumentos de palabras clave se puede obtener de https://github.com/JuliaLang/julia/pull/11165.

design help wanted speculative

Comentario más útil

O tal vez <strong i="5">@invoke</strong> foo(x, y::T) podría convertirse en invoke(foo, (typeof(x), T), x,y) , es decir, podría usar typeasserts para indicar la firma de llamada deseada.

Todos 3 comentarios

¿Los tipos usados ​​en invoke realmente tienen que ser supertipos de los valores proporcionados?

O tal vez <strong i="5">@invoke</strong> foo(x, y::T) podría convertirse en invoke(foo, (typeof(x), T), x,y) , es decir, podría usar typeasserts para indicar la firma de llamada deseada.

Como nueva característica, se puede considerar posterior a 1.0. Triage también siente que es poco probable que eliminemos invoke para 1.0.

¿Fue útil esta página
0 / 5 - 0 calificaciones