Tcl 我可以使用uplevel/upvar而不必使用global吗?

Tcl 我可以使用uplevel/upvar而不必使用global吗?,tcl,Tcl,所以,我正在测试一些东西,并有一个“测试”过程,如下所示: proc test {arg} { global state puts "Your arg is: $arg" set state 1 } test somearg vwait state 通过阅读uplevel和upvar,有没有一种方法可以让我不必使用global,而是使用其中任何一个选项将状态设置为“1”,然后退出程序?你要求的是两种不同的东西。首先,关于变量。您可以像这样使用upvar: proc te

所以,我正在测试一些东西,并有一个“测试”过程,如下所示:

proc test {arg} {
    global state
    puts "Your arg is: $arg"
    set state 1
}
test somearg
vwait state

通过阅读uplevel和upvar,有没有一种方法可以让我不必使用global,而是使用其中任何一个选项将状态设置为“1”,然后退出程序?

你要求的是两种不同的东西。首先,关于变量。您可以像这样使用
upvar

proc test {arg} {
    upvar #0 state state
    puts "Your arg is: $arg"
    set state 1
}
或者,更简单地说,您可以只使用名称空间限定名称:

proc test {arg} {
  puts "Your arg is: $arg"
  set ::state 1
}
问题的第二部分是
vwait
的一些奇怪用法。我只想指出,您的代码片段不会完成,因为您正在等待变量“state”更改,但没有任何事件会更改状态。您在调用
test
时已经更改了它。因此,除非您设置了一个窗口/按钮或可能导致
状态
的状态发生变化的东西,否则脚本将挂起


值得阅读和for
vwait

是,除了
vwait
始终使用全局变量等待(严格来说,它解析全局范围内的变量名称;如果提供限定名称,则可以使用其他名称空间)。您不能做的是等待局部变量(因为事件无法看到其自身调用堆栈之外的局部变量)。也许这在将来会改变,但现在肯定不会

关于
global
的问题,这些语句在一个过程中都是有效的:

global foo
variable ::foo
upvar #0 foo foo
upvar ::foo foo
namespace upvar :: foo foo

您的代码中也有一个bug:您在等待状态更改之前设置了状态。这无论如何都不会起作用,因为您必须先等待,然后从某种事件中设置状态。

在打开ssh会话后,我有另一个用于配置网络设备的过程。我有一个“vwait state”声明,类似于上面我发布的声明。在proc中,配置完成后,我会“设置状态1”。这是毫无问题的。我只是想知道为什么我上面的例子不起作用……但我必须继续挖掘。好吧,这是有道理的。谢谢那个“虫子”是我的错别字。我不是故意把它贴在那里的。谢谢!