Julia: adicionar macro @callsuper

Criado em 26 ago. 2016  ·  3Comentários  ·  Fonte: JuliaLang/julia

De acordo com https://github.com/JuliaLang/julia/pull/13123 , poderíamos adicionar uma macro @supercall que adoça a interface para invoke e a torne mais intuitiva. Minha implementação atual:

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

O suporte para argumentos de palavra-chave pode ser obtido em https://github.com/JuliaLang/julia/pull/11165.

design help wanted speculative

Comentários muito úteis

Ou talvez <strong i="5">@invoke</strong> foo(x, y::T) pudesse se transformar em invoke(foo, (typeof(x), T), x,y) , ou seja, você poderia usar declarações de tipo para indicar a assinatura de chamada desejada.

Todos 3 comentários

os tipos usados ​​em invoke realmente têm que ser supertipos dos valores fornecidos?

Ou talvez <strong i="5">@invoke</strong> foo(x, y::T) pudesse se transformar em invoke(foo, (typeof(x), T), x,y) , ou seja, você poderia usar declarações de tipo para indicar a assinatura de chamada desejada.

Como um novo recurso, pode ser considerado pós-1.0. A triagem também acha improvável que removeremos invoke por 1.0.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sbromberger picture sbromberger  ·  3Comentários

Keno picture Keno  ·  3Comentários

manor picture manor  ·  3Comentários

tkoolen picture tkoolen  ·  3Comentários

iamed2 picture iamed2  ·  3Comentários