Julia - 如何将 kwargs 从函数传递给宏

Dav*_*ira 6 arguments function julia

您可以定义一个函数来将其关键字参数传递给内部函数,如下所示:

function example(data;xcol,ycol,kwargs...)
    DoSomething(; spec=:EX, x=xcol, y=ycol, kwargs...)
end
Run Code Online (Sandbox Code Playgroud)

现在,该函数DoSomething接受许多参数,例如color. 这适用于函数,但我想用 VegaLite.jl 中的宏来做到这一点:

function example(data;xcol,ycol,kwargs...)
    @vlplot(data=data,mark=:point, x=xcol, y=ycol,kwargs...)
end
example(df,xcol=:Miles_per_Gallon, ycol=:Horsepower, color=:Origin)
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码不起作用。

Mat*_* B. 6

所以这里的答案是......这很棘手。事实上,一般来说,这是不可能的,除非宏本身支持它

看,宏在解析时进行它们的转换——并且通常会利用您实际编写的内容来表示不同和特殊的东西。例如,@vlplot将专门处理和支持类似 JSON 的{}语法。这些不是有效的 Julia 代码,不能传递给您定义的函数(如example)!

现在,很容易看到这一点并认为,好吧,让我们也将外部example事物变成一个宏!但这并不容易。我不确定是否有可能有一个总能适当地传递论点保持卫生的通用答案。我很确定您需要了解有关您正在调用的宏如何处理其参数的信息。


Bog*_*ski 5

您需要在;之前添加kwargs以表示它们kwargs不是位置参数,例如:

DoSomething(;spec=:EX, x=xcol, y=ycol, kwargs...)
Run Code Online (Sandbox Code Playgroud)

(这是DoSomething作为函数的答案,因为这是问题的原始表述)