利用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