我在理解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]
}有人能给我解释一下吗?书中的解释对我帮助不大:
发布于 2012-07-18 14:11:35
uplevel命令在与当前过程不同的作用域中执行命令(或者实际上是脚本)。特别是,在这种情况下,它是uplevel 1,意思是“在调用者中执行”。(您也可以使用uplevel #0在全局范围内执行,或者也可以在其他地方执行,比如使用uplevel 2的调用者,但这种情况非常少见。)
解释该行的其余部分:这里使用list作为构造无替换命令的一种方式,该命令由四个单词组成:foreach、args变量的内容、valueList变量的内容和break (实际上不需要用大括号括起来)。这将从valueList的前面为args中列出的每个变量分配一个值,然后停止,它将在调用方的上下文中执行此操作。
总体而言,该过程的工作方式与8.5中的内置lassign类似(假设输入列表和变量列表为非空),只是速度较慢,因为在作用域之间进行交换之类的事情比较复杂。
发布于 2015-02-27 18:16:24
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中,如果我改变了level的值,那么我可以改变任何proc的变量x的值,无论它是a,b,c,还是方法"a“本身的main proc。尝试将级别更改为3,2,1,0,然后查看神奇的putput。
https://stackoverflow.com/questions/11533962
复制相似问题