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
东西也变成一个宏吧!但这并不容易。我不确定是否有可能得到一个总能适当地传递参数的一般性答案 和 让卫生正确。我很确定您需要了解您所调用的宏如何处理其参数。
您可以像这样定义一个函数,将其关键字参数传递给内部函数:
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
东西也变成一个宏吧!但这并不容易。我不确定是否有可能得到一个总能适当地传递参数的一般性答案 和 让卫生正确。我很确定您需要了解您所调用的宏如何处理其参数。