朱莉娅:分配和获取功能

时间:2014-04-09 17:34:37

标签: assign julia

我希望能够通过简单的字符串循环为Julia中的变量赋值。

例如:

x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"

for i in 1:4
  val = get("x$i")
  var = letters[i]
  assign(var, val)
end

a
14

注意,我选择“assign”和“get”这个函数,因为我已经习惯了它。

我想要这样做的原因是因为我有一个函数,它接受多个参数,这些参数都被相同地评估,并且我认为没有重复代码的点。类似的东西:

function f(a,b,c,d) 

  if a<0 a==-9999 end
  if b<0 b==-9999 end
  if c<0 c==-9999 end
  if d<0 d==-9999 end

end

当然,我应用于每个函数的函数实际上比简单的重新编码命令长得多。

我想我可以这样做:

function f(a=1,b=2,c=3,d=4, p=[a,b,c,d])
    for (i in 1:4)
        if p[i]<0
            p[i]=-9999
        end
    end
    sum(p)
end

然而,这会产生“set index”的其他问题,这是我需要阅读的更多信息。谢谢你的考虑! 弗朗西斯

3 个答案:

答案 0 :(得分:1)

这就是诀窍:

x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"

for i  in 1:4
    assignment = parse("$(letters[i]) = x$(i)")
    eval(assignment)
end

您可以在这里阅读parse函数,它将字符串转换为表达式: http://julia.readthedocs.org/en/latest/stdlib/base/#Base.parse

答案 1 :(得分:1)

在你第二个建议做什么后,我想你可能真的想要这样的东西。

function f(args...)
    acc = zero(args[1])
    for a in args
        if a < 0
            acc -= 9999
        else
            acc += a
        end
    end
    acc
end

用法就像

答案 2 :(得分:0)

要在Julia中做这种奇怪的动态变量trixing,你必须使用宏和元编程。它的要点是代码生成的一个非常强大的接口。我认为可以在表单

上编写一个与上述代码相同的宏
x1, x2, x3, x4 = 14, 12, 34, 19
@assign("abcd", 1:4)

并翻译&#34;编译时间&#34;到

x1, x2, x3, x4 = 14, 12, 34, 19
begin
    a = x1
    b = x2
    c = x3
    d = x4
end

编写和调试这样一个宏需要一些时间。你能描述一下你的用例,所以我可以看看是否存在一些实际上不重要的约束,或者你想要的更多功能?例如1:4似乎是多余的,因为我可以使用for (i, letter) in enumerate("abcd")来获得相同的循环。