执行一个字符串?

时间:2015-03-27 11:55:33

标签: julia

我想执行一个字符串,但发现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

2 个答案:

答案 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传递给evaleval(parse("a"))。 (可选)您可以将模块传递给eval以在特定上下文中评估表达式(请参阅eval)。