2017-08-15 1 views
0

Ich möchte mit Ausdrücken bilden, wieEine einfache Interpolation Ausdrücke in julia

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

, weil ich interessiert bin ein Programm in writting, dass sie die Struktur in der Lage, der Benutzer nur ein System von Gleichungen, in denen zu schreiben gibt von ihnen und dann schreibt Julia explizit das Stück Code beteiligt. Allgemeiner würde Ich mag Funktionen in einem Ausdruck einbetten, so etwas wie

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

Nach der ersten Zeile des Codes Auswertung, erhalte ich

ERROR: UndefVarError: i not defined 
in eval(::Module, ::Any) at ./boot.jl:226 

Auf der anderen Seite, wenn ich

schreiben
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 

Wie wird in diesem Fall interpoliert?

Antwort

3

eval arbeitet im globalen Gültigkeitsbereich, daher kann es keine lokalen Variablen referenzieren. Was Sie tun können, ist jedoch, dass die Expression in einen größeren Teil des Codes interpolieren, die im globalen Bereich ausgeführt werden soll ist: für Angabe der geben Syntax

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 

Das @eval Makro ist eine einfache Stenografie und weitergeben entlang zur eval() Funktion. Es würde wahrscheinlich sogar besser, eine benutzerdefinierte Funktion zu definieren:

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 

Die üblichen Warnungen über eval gelten: beliebig weitergegeben Code kann böswillig tun ruchlose oder überraschende Dinge in Handarbeit gemacht werden. Oder stürzen Sie einfach das Programm ab.

+0

Das ist fast, was ich suche. Ich möchte z. von 'a [i] + b [j]' nach 'a [1] + b [4]', als ein Stück Code, um den Inhalt auf einen bestimmten Wert auszuwerten. Ja, es ist eher eine algebraische Manipulation als eine einfache Substitution. Der Grund ist, dass ich später möchte, dass das Programm beschließt, Dinge wie "a [1] + a [4] + b [3]" zu schreiben, die vom Benutzer bestimmt werden können. – user2820579

+0

Anders ausgedrückt, ich möchte einen Ausdruck wie 'sum_i = 1, na [i] + b [i]' in Codeform konvertieren, dh 'a [1] + b [1]', wenn 'n = 1' oder "a [1] + b [1] + a [2] + b [2]" wenn "n = 2". – user2820579

Verwandte Themen