我想执行一个字符串,但发现Julia中没有exec
函数:
a = 1
println(exec("a")) # ERROR: exec not defined
有没有办法在Julia中执行字符串?
最初的问题是我正在尝试记录变量列表:
thingsToLog = ["a", "b", "c"]
归档:
open(logFile, "w") do io
for thing in thingsToLog
write(io, @sprintf("%s = %s\n", thing, eval(thing)))
end
end
答案 0 :(得分:6)
如上所述,您可以调用parse从字符串创建AST,然后在其上调用eval
。但是,在您的示例中,将列表创建为
thingsToLog = [:a, :b, :c]
避免完全通过parse
。通常,将这样的引用AST(在本例中为符号)直接传递给eval
更容易,更安全;如果使用固定的AST集合还不够,您也可以将AST插入到引用的AST中(有关更多详细信息,请参阅手册)。
关于eval
:
关于本地范围内的评估,阅读此帖子让我意识到大多数必需的功能已经存在于Debug
包中,所以我刚刚发布了一个允许这样做的更新(上面的注意事项仍然适用) 。要在本地范围内评估代码的函数必须使用@debug_analyze
宏进行封装。然后,您可以使用@localscope
检索表示本地范围的对象,并通过索引相应的符号从中检索局部变量的值。例如:
using Debug
@debug_analyze function f(x,y,z,thingsToLog)
s = @localscope
for sym in thingsToLog
println(sym, " = ", s[sym])
end
end
f(1,2,3,[:x,:z])
打印
x = 1
z = 3
有关详细信息,请参阅Debug
软件包自述文件中的this section。
答案 1 :(得分:3)
首先在字符串上调用parse
,然后将生成的AST传递给eval
:eval(parse("a"))
。 (可选)您可以将模块传递给eval
以在特定上下文中评估表达式(请参阅eval
)。