Julia: 添加@callsuper 宏

创建于 2016-08-26  ·  3评论  ·  资料来源: JuliaLang/julia

根据https://github.com/JuliaLang/julia/pull/13123 ,我们可以添加一个@supercall宏,将界面添加到invoke并使其更直观。 我目前的实现:

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

可以从https://github.com/JuliaLang/julia/pull/11165获取对关键字参数的支持

design help wanted speculative

最有用的评论

或者,也许<strong i="5">@invoke</strong> foo(x, y::T)可以变成invoke(foo, (typeof(x), T), x,y) ,即您可以使用类型断言来指示所需的调用签名。

所有3条评论

invoke 中使用的类型实际上必须是所提供值的超类型吗?

或者,也许<strong i="5">@invoke</strong> foo(x, y::T)可以变成invoke(foo, (typeof(x), T), x,y) ,即您可以使用类型断言来指示所需的调用签名。

作为一个新功能,可以考虑1.0之后。 Triage 还认为我们不太可能为 1.0 删除invoke

此页面是否有帮助?
0 / 5 - 0 等级