È possibile dichiarare una variabile statica in Tcl?
Uso una determinata funzione per rilevare errori di comando sconosciuti e desidero che stampi un messaggio di errore alla prima comparsa di un comando sconosciuto, quindi è necessario mantenere qualcosa come una lista statica all'interno di proc
. È possibile?Variabile statica in Tcl
6
A
risposta
4
Oppure si può semplicemente utilizzare una scala variabile globale:
set varList {}
proc useCount {value} {
global varList ;
lappend varList $value
}
useCount One
useCount Two
puts $varList
2
No. Ma è possibile utilizzare una (di solito namespace) di matrice globale indicizzato per nome proc per esempio:
namespace eval foo {
variable statics
array set statics {}
}
...
proc ::foo::bar args {
variable statics
upvar 0 statics([lindex [info level 0] 0]) myvar
# use myvar
}
2
Tcl fa non supporta la variabile statica. Invece di utilizzare una variabile globale o una variabile all'interno di uno spazio dei nomi, un'altra alternativa è implementare la procedura come metodo all'interno di una classe (vedere [incr tcl] o snit). Se è necessario implementare variabile statica, il wiki Tcl ha una pagina che discutere di questo problema: http://wiki.tcl.tk/1532
0
Come non mi piace variabili globali (a meno che non si dispone di un piccolo script), che combinano soluzioni da @kostix e @Jackson:
namespace eval foo {
variable varList {}
}
proc foo::useCount {value} {
variable varList
lappend varList $value
}
foo::useCount One
foo::useCount Two
puts $foo::varList
Aggiornamento: vedere anche http://wiki.tcl.tk/memoizing per un'idea generale – kostix