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
13
A
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.