使用名称宏来表示函数输入中的变量

时间:2017-09-13 13:37:38

标签: macros julia

如果我有2个变量,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

这不会奏效,因为@varnamei并创建"i",例如:

out=test(a,b)

我想要的输出是:

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

有没有办法实现这种行为?

1 个答案:

答案 0 :(得分:2)

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!")

如果您想知道它是如何完成的,请查看其来源:

https://github.com/mauro3/Parameters.jl/blob/v0.7.3/src/Parameters.jl#L594