在 Julia 中使用 eval 处理可变参数
Using eval in Julia to deal with varargs
我刚开始使用 Julia。我正在尝试使用 eval(在 Julia 中)来在函数中定义一组变量。假设我想将 v1 设置为 2:
function fun_test(varargs...)
v1 = 0;
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);");
eval(expr_vargs);
end
end
println(v1)
end
调用函数为:
fun_test("v1", "2");
不行,因为println returns 0(v1的初始值)。但是,如果我 运行 在 Julia 的终端中进行类似的 eval 调用,那么它就可以工作。
能否请您解释一下为什么它不起作用以及如何解决它?
eval
在 toplevel scope 中运行,而不是在函数范围内。无法动态更新函数范围内的绑定。在不知道您的确切用例的情况下,我怀疑有一种方法可以在不进行动态重新绑定的情况下做事。特别是v1
、v2
等可能最好做成数组,V
.
然而,如果您真的必须,您总是可以在子模块中将v1
定义为全局变量:
module FunTest
v1 = 0
function fun_test(varargs...)
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
@eval $(varargs[i]) = $(varargs[i+1])
end
end
println(v1)
end
export fun_test
end
using .FunTest
fun_test(:v1, 2) # result: 2
(我还修改了您的代码以避免 parse
ing 字符串,最好通过 expression interpolation 完成。)
我刚开始使用 Julia。我正在尝试使用 eval(在 Julia 中)来在函数中定义一组变量。假设我想将 v1 设置为 2:
function fun_test(varargs...)
v1 = 0;
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);");
eval(expr_vargs);
end
end
println(v1)
end
调用函数为:
fun_test("v1", "2");
不行,因为println returns 0(v1的初始值)。但是,如果我 运行 在 Julia 的终端中进行类似的 eval 调用,那么它就可以工作。
能否请您解释一下为什么它不起作用以及如何解决它?
eval
在 toplevel scope 中运行,而不是在函数范围内。无法动态更新函数范围内的绑定。在不知道您的确切用例的情况下,我怀疑有一种方法可以在不进行动态重新绑定的情况下做事。特别是v1
、v2
等可能最好做成数组,V
.
然而,如果您真的必须,您总是可以在子模块中将v1
定义为全局变量:
module FunTest
v1 = 0
function fun_test(varargs...)
if length(varargs) > 0
j = collect(linspace(1,length(varargs)-1,length(varargs)/2));
for i in j
@eval $(varargs[i]) = $(varargs[i+1])
end
end
println(v1)
end
export fun_test
end
using .FunTest
fun_test(:v1, 2) # result: 2
(我还修改了您的代码以避免 parse
ing 字符串,最好通过 expression interpolation 完成。)