TCL中upvar 0和upvar 1之间的差异

TCL中upvar 0和upvar 1之间的差异,tcl,upvar,Tcl,Upvar,有谁能告诉我TCL中upvar 0和upvar 1之间的区别,我们如何实时使用。如果有人举个例子来解释,我会更清楚。好的,我想举个例子会让区别变得非常清楚: 假设我们有一个功能测试\u upvar1: proc test_upvar1 {} { upvar 1 a b incr b } 和功能测试_upvar0: proc test_upvar0 {} { upvar 0 a b incr b } 现在我们设置变量a并调用这两个函数来查看发生了什么: set

有谁能告诉我TCL中
upvar 0
upvar 1
之间的区别,我们如何实时使用。如果有人举个例子来解释,我会更清楚。

好的,我想举个例子会让区别变得非常清楚:

假设我们有一个功能测试\u upvar1:

proc test_upvar1 {} {
    upvar 1 a b
    incr b
}
和功能测试_upvar0:

proc test_upvar0 {} {
    upvar 0 a b
    incr b
}
现在我们设置变量a并调用这两个函数来查看发生了什么:

set a 5
test_upvar1
这将返回6

set a 5
test_upvar0
将返回1

发生这种情况的原因是,我们在同一执行帧1中选择0和1执行帧0链接,并将其高出一帧


请参见

当您调用一组过程时,会得到一堆堆栈帧。它是以名字命名的。我们可以这样设想:

abc 123 456 bcd 321 456 cde 654 321
upvar 0
示例-简化变量名称:
与upvar 1不同,upvar 0为变量创建别名。 例如:

输出:

output is 8 7
in global frame value of a is  7
output is 11 11
in global frame value of a is  4

非常感谢donal,我非常清楚地理解了upvar 1和upvar#0,upvar 0我理解了您的示例,但我无法理解upvar 0的实时使用。根据我的理解,似乎在memberproc作用域上创建了一个变量名var。如果你让我更清楚一点,那就好了。我急切地等待你的评论
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"
    set a 4 
proc upvar1 {a} {
upvar 1 a b
incr a 4
incr b 3
puts "output is $a $b"
}
proc upvar0 {a} {
upvar 0 a b
incr a 4
incr b 3
puts "output is $a $b"
}
upvar1 $a
puts "in global frame value of a is  $a"

set a 4
upvar0 $a
puts "in global frame value of a is  $a"
output is 8 7
in global frame value of a is  7
output is 11 11
in global frame value of a is  4