2013-12-10 3 views
13

C'è una semplice sintassi di Julia per l'assegnazione a una variabile solo se non è definita (o falsa)? Intendo qualcosa come Ruben's x ||= NEW_VALUE. Ho provato x || x=NEW_VALUE ma genera un errore. Escludendo la sintassi semplice, quale funzione posso usare per verificare se una variabile è definita?Assegna solo se non è già definito in Julia

risposta

24

È possibile utilizzare la funzione isdefined: isdefined(:x) || (x = NEW_VALUE).

2

Ho preparato una macro per gestire questo piccolo inconveniente.

macro ifund(exp) 
    local e = :($exp) 
    isdefined(e.args[1]) ? :($(e.args[1])) : :($(esc(exp)))  
end 

Poi REPL:

julia> z 
ERROR: UndefVarError: z not defined 

julia> @ifund z=1 
1 

julia> z 
1 

julia> z=10 
10 

julia> @ifund z=2 
10 

julia> z 
10 

Un esempio di interpolazione:

julia> w 
ERROR: UndefVarError: w not defined 

julia> w = "$(@ifund w="start:") end" 
"start: end" 

julia> w 
"start: end" 

Ma, ricordate della portata (y è nel campo di applicazione per-loop):

julia> y 
ERROR: UndefVarError: y not defined 

julia> for i=1:10 y = "$(@ifund y="") $i" end 

julia> y 
ERROR: UndefVarError: y not defined 

Lasciate so se funziona. Sono curioso, perché è il mio primo esercizio con i macro.