2014-09-27 15 views
6

voglio rispondere this question utilizzando metaprogrammazione, ma le regole di scoping di cicli for stanno causando le mie variabili non da definire in alto più-(REPL) portata:Dichiarare le variabili di primo livello in Julia usando metaprogrammazione

for x = [:A1, :A2] 
    @eval x = rand(2,2) 
end 

So che probabilmente c'è un modo semplice per aggirare questo, ma il mio cervello del venerdì sera non può pensarci. Uno di voi drogati che metaprogrammano può aiutarmi a trovare una soluzione sintetica? (Mi rendo conto che una macro potrebbe funzionare con la fuga, ma sto cercando di pensare a qualcosa di più breve)

+0

L'ho visto anche io e mi chiedevo come lo avresti metaprogrammato se avessi cento A. 'per x = 1: 100' e poi? Come possono essere fatti nomi variabili a livello di codice? – rickhg12hs

+1

Ho risposto al mio commento/domanda. 'for k = 1: 10 my_sym = symbol (" A "* stringa (k)); @eval $ my_sym = rand (2,2) fine' (Qui viene mostrato generare da A1 a A10.) – rickhg12hs

risposta

7

Se solo si desidera definire le variabili in ambito globale, si sta solo manca un $:

for x = [:A1, :A2] 
    @eval $x = rand(2,2) 
end 

Ma @eval viene sempre valutato al livello superiore anche se lo si inserisce in una funzione. Se si desidera definire le variabili in un ambito funzione, è necessario mettere l'intera funzione all'interno @eval, costruire il blocco di codice, e interpolare in funzione:

@eval function f() 
    ... 
    $([:($x = rand(2, 2)) for x in [:A1, :A2]]...) 
    ... 
end 

Questo codice può anche essere banalmente adattato in un macro (ma poi ha bisogno di esc).

+0

Ah, grazie. per il tuo secondo esempio ho provato una versione ridotta ma ho ottenuto: julia> @eval $ ([: ($ x = rand (2,2)) per x in [: B1,: B2]] ...) ERRORE: type: apply_type: in Vararg, atteso Type {T <: Top}, ottenuto Array {Expr, 1} – JKnight

+0

Sembra che sia necessario '@eval begin $ ([: ($ x = rand (2,2)) per x in [ : B1,: B2]] ...) end' o 'eval (Espr (: block, [: ($ x = rand (2,2)) per x in [: B1,: B2]] ...)) per far funzionare. Ma non sono sicuro che ci sia molto da fare, dal momento che definirà le variabili a livello globale anche se lo inserirai in una funzione, e se questo è ciò che penso dopo, il mio primo esempio sembra un po 'più bello. – simonster

Problemi correlati