.
.
uplevel - 在不同的堆栈层中执行一个脚本
uplevel ?level? arg ?arg ...?
所有的arg变元使用concat命令风格连接起来,连接起来的命令在level指定后的作用域中执行,uplevel返回执行结果。(堆栈层可以看作是变量起作用的范围)
如果level是一个整数,它指出了调用命令的堆栈距离目前调用堆栈的层数,如果level是以#后面加一个数字,那么这个数字就是命令执行的绝对堆栈层,缺省值为1,如果有了#符号那么后面必须跟一个数字。
例如,假设过程a在最高层调用,然后a调用b,再后来b调用c,假设c调用uplevel名令,如果level是1或者#2或者忽略掉,这个命令将在b的变量的作用域中执行,如果level是2或者#1,那么这个命令将在a的变量的作用域中执行,如果level是3或者#0,这个命令将在最高层执行(只有全局变量是可见的)。
uplevel命令导致在调用过程的堆栈层中"看不到"过程了,在下面的例子里,假设c调用命令:
uplevel 1 {set x 43; d}当d是另外一个过程时,set命令会在b的作用域中修改变量x,d将在第三层堆栈运行,就像是b过程调用的d过程。
uplevel {set x 42}set命令将会修改在b作用域中的x变量,在执行d的时候过程c对于调用堆栈层是不可见的,命令info level可以获得当前程序的堆栈层。
uplevel可以实现新的控制结构,例如,uplevel可以实现while过程。
uplevel命令在实现新的控制结构方面非常有用,下面的例子显示了它可以用来创建一个do命令:
proc do {body while condition} { if {$while ne "while"} { error "required word missing" } set conditionCmd [list expr $condition] while {1} { uplevel 1 $body if {![uplevel 1 $conditionCmd]} { break } } }