2014-01-21 4 views

ответ

6

Вы не можете. Julia's eval всегда оценивает код области текущего модуля, а не локальную область. Вызов eval во время выполнения - это анти-шаблон и убийца производительности.

1

В зависимости от приложения вы могли бы eval вся функция, чтобы получить локальное значение i, такое как @simonster, описано в this answer.

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