如何使 Tcl 循环变量存在于循环中,类似于 Perl foreach my



请参阅下面的Tcl shell代码和结果:

% foreach a { 1 2 3 4 5 } { puts $a }
1
2
3
4
5
% puts $a
5

变量 a 似乎留在内存中...例如,在Perl中,可以使用:

foreach my $a

并且$a在循环期间存在吗? 在 Ruby 中,可以使用闭包:

[1,2,3,4,5].each{|a| puts a.to_s() }

为了达到同样的目的。
在 Tcl 中是否有一种优雅的方法?
谢谢

您可以在闭包中进行迭代:

apply {vals {foreach a $vals {puts $a}}} {1 2 3 4 5}

或者,您可以将 body 设置为参数(在这种情况下,循环变量的名称也应该是一个参数):

apply {{varName vals body} {foreach $varName $vals $body}} a {1 2 3 4 5} {puts $a}

如果你称之为myForeach什么的,它看起来不那么麻烦:

set myForeach {{varName vals body} {foreach $varName $vals $body}}
apply $myForeach a {1 2 3 4 5} {puts $a}

您也可以将其设置为解释器宏:

set myForeach {{varName vals body} {foreach $varName $vals $body}}
interp alias {} myForeach {} apply $myForeach
myForeach a {1 2 3 4 5} {puts $a}

文档:应用,交换,插入包,插入,看跌,设置

这不是

foreach的当前语义,而且在不久的将来极不可能改变,因为它会对许多人现有的代码产生严重影响。特别是,许多人目前使用:

foreach {a b c d} $someList break

而不是做:

lassign $someList a b c d

因为这在 Tcl 8.4 及之前是有效的,从那以后他们就没有更新过他们的编码风格。

最新更新