使用符号数组填充julia字典

时间:2015-05-31 00:21:40

标签: scope metaprogramming julia

我在Julia表达式中遇到了一些范围基础知识。有人可以帮助告诉我下面的for循环中出了什么问题吗?在lopp内部,第一个表达式起作用而第二个表达式不起作用,尽管两个表达式都适用于全局范围内的变量。

x = 1

glob_obj = :x
eval(:(println($glob_obj)))
eval(:(println("$glob_obj")))
# Prints
# 1
# x

objs = [:x]
for obj = objs
    eval(:(println($obj)))
    eval(:(println("$obj")))
end
# Prints
# 1
# ERROR: obj not defined
#  in anonymous at no file:3

对于上下文,我最终有兴趣编写一个Julia函数,该函数从本地范围内的符号数组填充字典,即像

这样的函数
x = 1
y = "foo"
populate_dict([:x, :y]) # ...resulting in 
{ "x" => 1, "y" => "foo"}

重要的是,我希望能够在任何函数中使用它并让它从本地范围中获取变量。对于更多上下文,这是使用任意符号列表轻松编写JSON文件。

1 个答案:

答案 0 :(得分:4)

您遇到的范围问题是eval始终评估全局范围内的表达式(当前模块,除非另有说明)。在这种特殊情况下,您可以使用

来处理
println(obj)

而不是eval(:(println("$obj")));看这个符号本身没有必要进行评估!

但如果你的最终目标是在函数中获取局部变量的值,那么上面的答案就是eval没有做到这一点。这是一个非常深刻的设计决策,允许编译器进行各种优化,否则它将无法进行。

然而,可以借助Debug包获取本地变量,请参阅我对Execute a string?的回答。