7

我在理解在 TCL 中使用 uplevel 时遇到了一些问题。我正在阅读 Brent Welch 在 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]
}

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

4

2 回答 2

7

uplevel命令在当前过程之外的另一个范围内执行命令(或实际上是脚本)。特别是,在这种情况下,它的uplevel 1意思是“在调用者中执行”。(您也可以在全局范围内执行 with uplevel #0,或者在其他地方执行,例如调用者的调用者 with ,uplevel 2但这真的很少见。)

解释该行的其余部分:list此处的使用是一种构造无替换命令的方式,该命令由四个单词组成,foreach变量args的内容,变量的内容valueListbreak(实际上并不需要在大括号中)。这将为 中valueList列出的每个变量分配一个值args,然后停止,它将在调用者的上下文中执行此操作。

总的来说,该过程就像 8.5 中的内置程序一样工作lassign(假设一个非空的输入列表和变量列表),除了因为范围和类似事物之间交换的复杂性而变慢。

于 2012-07-18T06:11:34.637 回答
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"

这里最内部的方法a将在级别0,b在级别,c在级别2,主程序将在级别3,所以在proc a中如果我更改级别的值,那么我可以更改任何变量x的值proc是方法“a”本身的a,b,c或main proc。尝试将级别更改为 3,2,1,0 并查看神奇的 putput。

于 2015-02-27T10:16:23.623 回答