请参阅下面的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 及之前是有效的,从那以后他们就没有更新过他们的编码风格。