如何在Julia中评估局部变量

时间:2014-01-21 20:04:01

标签: julia

i = 50
function test()
  i = 10
  eval(:i)
end
test()  # => 50

为什么这会评估全局i而不是本地{{1}}?有没有办法让它评估到当地?

4 个答案:

答案 0 :(得分:6)

你不能。 Julia的eval总是评估代码当前模块的范围,而不是本地范围。在运行时调用eval是反模式和性能杀手。

答案 1 :(得分:2)

正如@StefanKarpinski所提到的那样eval总是在全局范围内进行评估,但是如果一个人真的想在本地评估一些东西,那么有多种方法可以做到:

import Base.Cartesian.lreplace
i = 50
function test1(expr)
  i=10
  eval(lreplace(expr,:i,i))
end

i = 50
function test2()
  i = 10
  @eval $i
end
test1(:(i))  # => 10
test2()      # => 10

但我在运行时评估表达式的首选方法是创建一个函数,我认为它是最有效的:

exprtoeval=:(x*x)
@eval f(x)=$exprtoeval
f(4) # => 16

答案 2 :(得分:1)

根据应用程序的不同,您可以eval整个函数获取i的本地值,例如this answer中@simonster描述的内容。

答案 3 :(得分:0)

带有嵌套宏的替代解决方案:

macro _localeval(ex)
  esc(:($ex))
end

macro localeval(ex)
  esc(@_localeval(Meta.parse(ex)))
end

i = 50
function test()
  i = 10
  @localeval "i"
end

test()