我在理解 TCL 中 uplevel 的使用时遇到了一些问题。我正在阅读 Brent Welch 在 TCL 和 Tk 中的实用编程,并且有一个我无法理解的 uplevel 示例。这里是:
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]
}
有人可以向我解释一下吗?书中的解释对我帮助不够:(
最佳答案
uplevel
command 在当前过程之外的另一个范围内执行命令(或实际上是脚本)。特别是,在这种情况下,它是 uplevel 1
这意味着“在调用者中执行”。 (您也可以使用 uplevel #0
在全局范围内执行,或者也可以在其他地方执行,例如使用 uplevel 2
的调用者的调用者,但这真的很少见。)
解释该行的其余部分: list
的使用这里是一种构造无替换命令的方法,它由四个字组成,foreach
,内容args
变量,valueList
的内容变量,和 break
(实际上并不需要放在大括号中)。这将从 valueList
的前面分配一个值到 args
中列出的每个变量,然后停止,它会在调用者的上下文中这样做。
总体而言,该程序的工作方式与内置 lassign
相同。在 8.5 中(假设一个非空的输入列表和变量列表),除了由于作用域和类似事物之间交换的复杂性而变慢。
关于tcl - 无法理解 TCL 中的上级命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11533962/