Difference between upvar 0 and upvar 1 in TCL -


can let me know difference between upvar 0 , upvar 1 in tcl, how can use in real time. kindly, if explain example, makes me more clear.

when calling bunch of procedures, stack of stack frames. it's in name. might visualise so:

 abc 123 456    bcd 321 456       cde 654 321 

ok, we've got abc calling bcd calling cde. simple.

the 0 , 1 in upvar how many levels go stack when looking variable link to. 1 means go 1 level (i.e., caller of current frame), cde bcd in our example, 2 go cde abc , 3 way global evaluation level overall scripts , callbacks run. 0 special case of this; means lookup in current stack frame. there's ability use indexing base of stack putting # in front of name, #0 indicates global frame, #1 first thing calls.

the common use of upvar upvar 1 (and if leave level out, that's does). upvar 0 used when want different (usually easier work with) name variable. next common 1 upvar #0, though global more common shorthand there (which matches unqualified parts of name convenience). other forms rare; example, upvar 2 indication of confusing , tangled code, , hardly ever used upvar #1 before tcl 8.6's coroutines. i've never seen upvar 3 or upvar #2 in wild (though computed level indicators present in object systems tcl).

example of upvar 1 — pass variable name:

proc mult-by {varname multiplier} {     upvar 1 $varname var     set var [expr {$var * $multiplier}] }  set x 2 mult-by x 13 puts "x $x" # x 26 

example of upvar 0 — simplify variable name:

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 # my_memory_array(x) = ""x 123" 345" # my_memory_array(y) = ""y 234" 456" 

Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -