Macros 对函数输入中的变量使用名称宏

Macros 对函数输入中的变量使用名称宏,macros,julia,Macros,Julia,如果我有两个变量,a=[.3,2,4];b=[1,2,3]我可以使用宏创建具有变量名称的字符串: macro varname(arg) string(arg) end @varname(a) 现在假设我有一个函数,我想给它传递任意数量的参数,并使用给定给函数的实际变量名来创建字典键: function test(arguments...) Dict(Symbol(@varname(i)) => i for i in arguments) end 这将不起作用,因为@v

如果我有两个变量,
a=[.3,2,4];b=[1,2,3]我可以使用宏创建具有变量名称的字符串:

macro varname(arg)
    string(arg)
end

@varname(a)
现在假设我有一个函数,我想给它传递任意数量的参数,并使用给定给函数的实际变量名来创建字典键:

function test(arguments...)
    Dict(Symbol(@varname(i)) => i for i in arguments)
end
这将不起作用,因为
@varname
将采用
i
并创建
“i”
,例如:

out=test(a,b)
我想要的输出是:

Dict("a" => [.3, .2, .4], "b" => [.1, .2, .3])

有没有办法实现这种行为

Parameters.jl有这样一个宏。它的工作原理如下:

using Parameters
d = Dict{Symbol,Any}(:a=>5.0,:b=>2,:c=>"Hi!")
@unpack a, c = d
a == 5.0 #true
c == "Hi!" #true

d = Dict{Symbol,Any}()
@pack d = a, c
d # Dict{Symbol,Any}(:a=>5.0,:c=>"Hi!")
如果您想知道它是如何完成的,只需查看其来源:


如果
参数
是位置参数的可变长度元组,则它们没有名称。另一方面,如果定义为
函数测试(;arguments…
,它生成
参数
命名参数,那么
Dict(a[1]=>a[2]表示in参数)
通常应该起作用(参数名称重复的边缘情况除外)。