I was noticing a discussion on comp.lang.tcl about variable scope and when I searched the wiki, I didn't notice quickly any place where the topic of scope was centrally discussed.
Tcl has several layers of scoping - from an article by Bryan Oakley, we read:
Sektor van Skijlen wrote: > Could someone explain me, what is the proper syntax with correct scope for > variables, which are: > > - declared inside in a namespace
variable varname ?initValue?
> - globally
global varname ?varname ...?
LV With the advent of namespaces, one can provide a more consistent variable usage by using ::varname as opposed to invoking the global command with varname.
RHS However, if you're accessing the variable a lot, its worth using the global command, since it is faster to access the variable that way. Assuming performance matters in what you are doing.
% proc p1 {} { global v1 ; for {set i 0} {$i <1000} {incr i} { set v1 } } % proc p2 {} {for {set i 0} {$i <1000} {incr i} { set ::v2 } } % time { p1 } 100 1802 microseconds per iteration % time { p2 } 100 4520 microseconds per iteration
LV Curious - is it due to additional parsing? Or is tcl just missing an optimization?
> - accessed in a proc defined in the same namespace
use variable if you wish to reference the namespace variable, global if you want to reference the global variable. Use neither to reference a local variable.
Please add other information, discussion, corrections to this page.
Note that merely declaring a variable with the global or variable command does NOT create the variable. It just tells Tcl where to go looking for the variable if there's a reference to it.