【问题标题】:using a name macro for variables from a functions inputs对来自函数输入的变量使用名称宏
【发布时间】:2017-09-13 13:37:38
【问题描述】:

如果我有 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

这行不通,因为@varname 将采用i 并创建"i",例如:

out=test(a,b)

我想要的输出是:

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

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

【问题讨论】:

  • 如果arguments 是位置参数的可变长度元组,那么它们没有名称。另一方面,如果定义是function test(;arguments...),这使得arguments 命名参数,那么Dict(a[1]=>a[2] for a in arguments) 通常应该可以工作(除了参数名称重复等的极端情况)。

标签: macros julia


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2016-04-23
    • 2018-10-09
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多