利用julia中的表达式进行简单插值
我想形成这样的表达利用julia中的表达式进行简单插值,julia,metaprogramming,Julia,Metaprogramming,我想形成这样的表达 julia> ex = :(a[$i,$j] + b[$i,$j]) 因为我对编写一个程序感兴趣,它能够编写一个方程组,其中用户只给出它们的结构,然后julia显式地编写所涉及的代码块。更一般地说,我想在表达式中嵌入函数,比如 julia> ex = :(a[$myfunc(i,j),$j] + b[$i,$j]) 在计算第一行代码时,我得到 ERROR: UndefVarError: i not defined in eval(::Module, ::An
julia> ex = :(a[$i,$j] + b[$i,$j])
因为我对编写一个程序感兴趣,它能够编写一个方程组,其中用户只给出它们的结构,然后julia显式地编写所涉及的代码块。更一般地说,我想在表达式中嵌入函数,比如
julia> ex = :(a[$myfunc(i,j),$j] + b[$i,$j])
在计算第一行代码时,我得到
ERROR: UndefVarError: i not defined
in eval(::Module, ::Any) at ./boot.jl:226
另一方面,如果我写
julia> ex = :(a[i,j] + b[i,j])
:(a[i,j] + b[i,j])
julia> for i in 1:2
for j in 1:2
println(eval(ex))
end
end
ERROR: UndefVarError: i not defined
in eval(::Module, ::Any) at ./boot.jl:226
[inlined code] from ./boot.jl:225
in anonymous at ./<no file>:4294967295
in eval(::Module, ::Any) at ./boot.jl:226
julia>ex=:(a[i,j]+b[i,j])
:(a[i,j]+b[i,j])
朱莉娅>我以1:2获胜
对于1:2中的j
println(eval(ex))
终止
终止
错误:未定义错误:未定义
在./boot.jl:226的eval(::模块,::任意)中
[内联代码]来自./boot.jl:225
匿名地址:4294967295
在./boot.jl:226的eval(::模块,::任意)中
在这种情况下如何进行插值?在全局范围内工作,因此它不能引用任何局部变量。但是,您可以将该表达式插入到更大的代码块中,以便在全局范围内执行:
julia> a = [1 2; 3 4]
b = [5 6; 7 8]
ex = :(a[i,j] + b[i,j]);
julia> @eval for i in 1:2
for j in 1:2
println($ex)
end
end
6
8
10
12
@eval
宏是引用传递的语法并将其传递给eval()
函数的简单缩写。甚至最好定义一个自定义函数:
julia> @eval function f()
for i in 1:2
for j in 1:2
println($ex)
end
end
end
f (generic function with 1 method)
julia> f()
6
8
10
12
关于eval
apply的常见警告:任何传递的代码都可能被恶意设计来做邪恶或令人惊讶的事情。或者干脆使程序崩溃。在全局范围内工作,因此它不能引用任何局部变量。但是,您可以将该表达式插入到更大的代码块中,以便在全局范围内执行:
julia> a = [1 2; 3 4]
b = [5 6; 7 8]
ex = :(a[i,j] + b[i,j]);
julia> @eval for i in 1:2
for j in 1:2
println($ex)
end
end
6
8
10
12
@eval
宏是引用传递的语法并将其传递给eval()
函数的简单缩写。甚至最好定义一个自定义函数:
julia> @eval function f()
for i in 1:2
for j in 1:2
println($ex)
end
end
end
f (generic function with 1 method)
julia> f()
6
8
10
12
关于
eval
apply的常见警告:任何传递的代码都可能被恶意设计来做邪恶或令人惊讶的事情。或者干脆让程序崩溃。这几乎就是我想要的。例如,我希望从a[I]+b[j]
到a[1]+b[4]
,作为一段代码,以一定的值评估内容。是的,它更像是代数运算,而不是简单的代换。原因是,后来我希望程序决定编写类似用户可以确定的a[1]+a[4]+b[3]
。换言之,我希望将类似sum_I=1,na[I]+b[I]
的表达式转换为代码形式,即a[1]+b[1]
,如果n=1
,或a[1]+b[1]+a[2]+b[2]
如果n=2
。这几乎就是我要找的。例如,我希望从a[I]+b[j]
到a[1]+b[4]
,作为一段代码,以一定的值评估内容。是的,它更像是代数运算,而不是简单的代换。原因是,后来我希望程序决定编写类似用户可以确定的a[1]+a[4]+b[3]
。换言之,我希望将类似sum_I=1,na[I]+b[I]
的表达式转换为代码形式,即a[1]+b[1]
,如果n=1
,或a[1]+b[1]+a[2]+b[2]
如果n=2
。