如上所述,您可以调用 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
有关更多详细信息,请参阅本节 https://github.com/toivoh/Debug.jl#evaluation-of-code-in-local-scope in the Debug
包自述文件。