在TCL中无法理解uplevel命令

cof*_*eak 6 tcl

我在理解在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)

有人可以向我解释一下吗?书中的解释对我没有帮助:(

Don*_*ows 7

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 并查看魔法输入。