如何在Julia中对函数进行修饰?

6

作为一个 Julia 包的开发者,我写了多个如下类型的函数:

function scatterplot(data; x_col=:x, y_col=:y)

    data |> @vlplot(:circle, x=x_col, y=y_col)
end

现在的问题是,我实际上想在这个函数中实现kwargs,类似于:

function scatterplot(data; x_col=:x, y_col=:y; kwargs...)

    data |> @vlplot(:circle, x=x_col, y=y_col;kwargs...)
end

但是由于@vlplot是一个宏,所以这实际上不起作用。因此,我需要像以下这样实际使用元编程:

function example(data;xcol,ycol,kwargs...)
    x = kwargs
    expression = "@vlplot(data=$data,mark=:point, x=$xcol, y=$ycol,"
    for (k,v) in x
        add = string(k,"=",v,",")
        expression = expression*add
    end
    expression = expression[1:end-1]*")"
    return expression
end

事实上,如果我想使用“kwargs”,我希望避免为每个函数编写此循环,因此,有什么方法可以做到这一点吗?
我的想法是以某种方式"装饰"每个函数,例如@decorate_with_kwargs scatterplot。这可行吗?

基本上,你可以使用元编程或多重分派来实现。你的问题不太清楚,因为DoSomething(a,b,C)不存在。你希望它与DoSomething(a,b)有什么关系? - Przemyslaw Szufel
我猜你是对的。写宏可能会更好。 - Davi Barreira
我将提供真实的例子并深入探讨问题,以使其更清晰明了。 - Davi Barreira
不是很确定。我想知道是否可以在我的函数中添加一个包装器,从而增加它们的功能。 - Davi Barreira
你没有 vlplot(args...; kwargs...) 吗?- 这应该是正确的方法。 - Przemyslaw Szufel
显示剩余5条评论
1个回答

4

以下是一种可能性:

function debugger(f, params...)
    @show f, params
    res = f(params...)
    @show res
    res
end

现在进行测试:

julia> f(x,y) = x+y;

julia> debugger(f, 2,3)
(f, params) = (f, (2, 3))
res = 5
5

如果你的目标是在宏中处理 kwargs,可以按照以下步骤:

function gn(x, args...;kwargs...)
    println("I am called with x=$x args=$args kwargs=$kwargs")
end

macro fn(x, args...)
    aargs = []
    aakws = Pair{Symbol,Any}[]
    for el in args
        if Meta.isexpr(el, :(=))
            push!(aakws, Pair(el.args...))
        else
            push!(aargs, el)
        end
    end
    quote
        gn($x, $aargs...; $aakws...)
    end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接