如何在while循环中创建变量global

时间:2014-05-26 11:34:27

标签: while-loop tcl

以下是TCL脚本,使用while循环打印1到10之间的数字。

set b 1

while {$b<11} {
    puts $b
    incr b
}

在上面的脚本中,如何制作&#34;放置$ b&#34;输出为全球。那么我们可以在脚本中的任何地方使用它吗?

我需要以下内容:

set b 1

while {$b<11} {
    set a $b
    incr b
}

puts "This is number $a"

如果我在外部循环中使用$a,它应该将输出打印为:

This is number 1
This is number 2
This is number 3
.
.
.
This is number 10

2 个答案:

答案 0 :(得分:3)

Tcl确实严格运作;它在你告诉它的地方做事情。但是,您可以做的一件事是在变量上放置trace,以便在写入变量时运行某些代码。

# This is Tcl 8.5 syntax; let me know if you want it for 8.4 and before
trace add variable ::a write {apply {args {
   puts "This is number $::a"
}}}

我上面使用了完全限定的变量名;跟踪实际上位于命名空间a中的变量::
然后,设置跟踪之后,当我们执行:

set b 1

while {$b<11} {
    set a $b
    incr b
}

输出是:

This is number 1
This is number 2
This is number 3
This is number 4
This is number 5
This is number 6
This is number 7
This is number 8
This is number 9
This is number 10

这就是你想要的。

答案 1 :(得分:0)

你的问题并不完全清楚:我认为Donal Fellows可能给你正确答案,但我想我可能会在你的文本中看到另一个问题,即:我怎么能写一个通用的命令,因为它是的,拿一个变量进行短暂的旋转?

如:

set b 1

myLoop b {
    set a $b
    puts "This is number $a"
}
puts "Again, this is number $a"

你会像这样写myLoop

proc myLoop {varName body} {
    upvar 1 $varName i
    for {} {$i < 11} {incr i} {
        uplevel 1 $body
    }
}

请注意,这不是编写这样的命令的最佳方法:我这样写它是为了适应您的示例代码。

该命令的工作原理是调用uplevel来评估调用者上下文中body中的脚本,无论哪个。为了允许myLoop操作脚本中的变量,我们需要设置一些东西,以便命令与调用者共享变量。 upvar命令执行此操作。