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

Julia - How to pass kwargs from a function to a macro

您可以像这样定义一个函数,将其关键字参数传递给内部函数:

function example(data;xcol,ycol,kwargs...)
    DoSomething(; spec=:EX, x=xcol, y=ycol, kwargs...)
end

现在,函数 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)

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

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

DoSomething(;spec=:EX, x=xcol, y=ycol, kwargs...)

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

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

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

现在,很想看到这个并想,好吧,让我们把那个外部 example 东西也变成一个宏吧!但这并不容易。我不确定是否有可能得到一个总能适当地传递参数的一般性答案 让卫生正确。我很确定您需要了解您所调用的宏如何处理其参数。