我在理解在TCL中使用uplevel时遇到了一些问题.我正在阅读布伦特韦尔奇在TCL和Tk的实用编程,并且有一个我无法理解的高级例子.这里是:
proc lassign {valueList args} {
if {[llength $args] == 0} {
error "wrong # args:lassign list varname ?varname...?"
}
if {[llength $valueList] == 0} {
#Ensure one trip through the foreach loop
set valueList [List {}]
}
uplevel 1 [list foreach $args $valueList {break}]
return [lrange $valueList [llength $args] end]
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下吗?书中的解释对我没有帮助:(
该uplevel命令在另一个范围内执行命令(或实际上是一个脚本),而不是当前过程的范围.特别是,在这种情况下,uplevel 1它意味着"在呼叫者中执行".(您也可以在全局范围内执行uplevel #0,或者在其他地方执行,例如调用者的调用者,uplevel 2但这种情况非常罕见.)
在解释该行的其余部分:使用的list这里是构建一个免费的替代命令的一种方式,它由四个单词,foreach中,内容args变量,内容valueList变量,break(这其实并没有需要在括号里).这将从前面分配一个值valueList到列出的每个变量args,然后停止,它将在调用者的上下文中这样做.
总的来说,该过程就像lassign8.5中的内置(假设非空输入列表和变量列表)一样,除了因为范围和类似事件之间的交换的复杂性而变慢之外.
小智 5
proc a {} {
set x a
uplevel 3 {set x Hi}
puts "x in a = $x"
}
proc b {} {
set x b
a
puts "x in b = $x"
}
proc c {} {
set x c
b
puts "x in c = $x"
}
set x main
c
puts "x in main == $x"
Run Code Online (Sandbox Code Playgroud)
这里最内部的方法 a 将在级别 0 中,b 在级别中,c 在级别 2 中,主程序将在级别 3 中,因此在 proc a 中,如果我更改级别的值,那么我可以更改任何变量 x 的值proc 是 a、b、c 或来自方法“a”本身的主要 proc。尝试将级别更改为 3,2,1,0 并查看魔法输入。