Julia 执行一个字符串?

Julia 执行一个字符串?,julia,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

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

首先对字符串调用
parse
,然后将生成的AST传递给
eval
eval(parse(“a”)
。或者,您可以将模块传递给
eval
,以便在特定上下文中对表达式进行求值(请参阅)。

如上所述,您可以调用parse从字符串创建AST,然后调用
eval
。不过,在您的示例中,将列表创建为

thingsToLog = [:a, :b, :c]
为了避免完全通过
解析
。通常,将这样引用的AST(在本例中为符号)直接传递到
eval
,既简单又安全;如果一组固定的AST不够,您还可以将AST插入到引用的AST中(有关更多详细信息,请参阅手册)

关于
eval
,还有几句话需要注意:

  • 根据设计,它只在全局范围内工作
  • 它不快,因为它需要编译新代码。因此,最好将它保留给只需要执行一次的评估(例如评估生成的方法或类型定义),或者速度不是很重要的时候
  • 这会导致代码很难理解
关于局部范围内的评估,阅读此线程使我意识到大部分必需的功能已经存在于
调试
包中,因此我刚刚发布了一个允许此操作的更新(尽管上面的注意事项仍然适用)。要在本地范围内计算代码的函数必须使用
@debug\u 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

有关更多详细信息,请参阅
调试
程序包自述。

更有趣的是如何重构函数
复杂的函数(a,b,c;thingsToLog=[:x,:y,:z]]
以按预期工作,因为
eval
在这种情况下不起作用。为此发布一个新问题,并充实一下细节如何?我不太清楚你想的是哪种情况。这正是我想象的@Adobe真正想要做的:通过传递要打印的变量名称,从复杂的算法中获得可选的调试输出。我同意这是一个不同的问题,但我猜这是juliav1.0中的一个.code>eval(Meta.parse(“a”)