When you call a bunch of procedures, you get a stack of stack frames. It is in the title. We could visualize it like this:
abc 123 456
bcd 321 456
cde 654 321
OK, so we have a abccall bcdcalling cde. Plain.
0 1 upvar , , . 1 ( ), cde bcd , 2 cde abc 3 , . 0 - ; , . , # , #0 , #1 , .
upvar upvar 1 ( , ). upvar 0 , ( ) . - upvar #0, global - ( ). ; , upvar 2 , - - upvar #1 , Tcl 8.6 . upvar 3 upvar #2 ( Tcl).
upvar 1 - :
proc mult-by {varName multiplier} {
upvar 1 $varName var
set var [expr {$var * $multiplier}]
}
set x 2
mult-by x 13
puts "x is now $x"
# x is now 26
upvar 0 - :
proc remember {name contents} {
global my_memory_array
upvar 0 my_memory_array($name) var
if {[info exist var]} {
set var "\"$var $contents\""
} else {
set var "\"$name $contents\""
}
}
remember x 123
remember y 234
remember x 345
remember y 456
parray my_memory_array