2017-08-15 30 views
0

表情,我想形成像一个简单的插值使用朱莉娅

julia> ex = :(a[$i,$j] + b[$i,$j]) 

表情,因为我感兴趣的书面方式一个程序,它能够写方程的系统中,用户只给出了结构然后茱莉亚明确写入了涉及的代码块。更一般地,我想嵌入一个表达式的功能,像

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 

在这种情况下如何进行插值?

回答

3

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通常的警告适用于:任何通过代码可以被恶意制作的做邪恶的或者令人惊讶的事情。或者只是让程序崩溃。

+0

这几乎是我在找的东西。我想得到,例如从'a [i] + b [j]'到'a [1] + b [4]',作为一段代码,以一定的值评估内容。是的,它更多的是代数操作,而不是简单的替换。原因是后来我想让程序决定写一些可以由用户决定的'a [1] + a [4] + b [3]'。 – user2820579

+0

换句话说,如果'n = 1',我想以代码形式,即'a [1] + b [1]'来转换一个像'sum_i = 1,na [i] + b [i] ,或者如果n = 2,则a [1] + b [1] + a [2] + b [2]。 – user2820579