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

时间:2020-11-09 19:26:39

标签: function arguments julia

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

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)

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

2 个答案:

答案 0 :(得分:4)

所以这里的答案是...很棘手。实际上,通常,除非宏本身支持,否则这是不可能的。

看,宏在解析时进行转换-经常会利用您实际编写的的含义来表达不同而又特殊的含义。例如,@vlplot将专门处理并支持类似JSON的{}语法。这些不是有效的Julia代码,无法传递给您定义的函数(如example)!

现在,很容易看到这一点,并认为,好吧,让我们也将外部example的东西变成一个宏!但这不是那么容易。我不确定是否有一个总的答案能够始终正确地传递参数,并且 使卫生正确无误。我很确定您需要了解有关所调用的宏如何处理其参数的知识。

答案 1 :(得分:3)

您需要在let array = [ { Items: [ 'a', 'b', 'c' ], Name: 'Test1' }, { Items: [ 'd', 'e', 'f' ], Name: 'Test2' } ]; let itemsCount = 5; let filteredArray = []; array.some(group => { if (itemsCount <= 0) { return true; } if (group.Items.length <= itemsCount) { itemsCount -= group.Items.length; } else { group.Items = group.Items.slice(0, itemsCount); itemsCount = 0; } filteredArray.push(group); }); console.log(filteredArray); 之前添加;,以表明它们不是kwargs的位置参数,例如:

kwargs

(这是DoSomething(;spec=:EX, x=xcol, y=ycol, kwargs...) 作为函数的答案,因为这是问题的原始表述)