2015-05-31 2 views
1

Я зацикливаюсь на некоторых основах сферы в выражениях Юлии. Может кто-нибудь помочь мне рассказать, что происходит внутри цикла for ниже? Внутри lopp первое выражение работает, а второе - нет, хотя оба работают с переменными из глобальной области.Заполнение словаря julia с массивом символов

x = 1 

glob_obj = :x 
eval(:(println($glob_obj))) 
eval(:(println("$glob_obj"))) 
# Prints 
# 1 
# x 

objs = [:x] 
for obj = objs 
    eval(:(println($obj))) 
    eval(:(println("$obj"))) 
end 
# Prints 
# 1 
# ERROR: obj not defined 
# in anonymous at no file:3 

Для контекста, я в конечном счете заинтересован в написании функции Julia, заполняющую словарь из массива символов в локальной области видимости, то есть функции, как

x = 1 
y = "foo" 
populate_dict([:x, :y]) # ...resulting in 
{ "x" => 1, "y" => "foo"} 

Важно отметить, что я бы чтобы иметь возможность использовать это в любой функции и иметь возможность выбирать переменные из локальной области. Для еще большего контекста это легко легко записать файлы JSON с произвольными списками символов.

ответ

4

Проблема, с которой вы работаете, заключается в том, что eval всегда оценивает выражения в глобальной области видимости (текущий модуль, если не указано иное). В данном конкретном случае, вы могли бы справиться с этим с помощью

println(obj) 

вместо eval(:(println("$obj"))); нет никакой оценки, необходимой для просмотра самого символа!

Но если ваша конечная цель - поднять значения локальных переменных в функции, ответ, как указано выше, заключается в том, что eval этого не делает. Это довольно глубокое дизайнерское решение, которое позволяет компилятору делать всевозможные оптимизации, чтобы он не смог иначе.

Однако можно получить локальные переменные с помощью пакета Debug, см. Мой ответ на Execute a string?.

Смежные вопросы