执行一个字符串?

Ado*_*obe 1 julia

我想执行一个字符串,但发现execJulia中没有函数:

a = 1
println(exec("a")) # ERROR: exec not defined
Run Code Online (Sandbox Code Playgroud)

有没有办法在Julia中执行字符串?

最初的问题是我正在尝试记录变量列表:

thingsToLog = ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

提交:

open(logFile, "w") do io
    for thing in thingsToLog
        write(io, @sprintf("%s = %s\n", thing, eval(thing)))
    end
end
Run Code Online (Sandbox Code Playgroud)

Toi*_*son 6

如上所述,您可以调用parse从字符串创建AST,然后调用eval它.但是,在您的示例中,创建列表似乎更容易

thingsToLog = [:a, :b, :c]
Run Code Online (Sandbox Code Playgroud)

避免通过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])
Run Code Online (Sandbox Code Playgroud)

打印

x = 1
z = 3
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅软件包自述文件中的此部分Debug.