Tcl 的 foreach 不设置变量

问题描述 投票:0回答:1

我正在重新定义 Tcl 的

set
命令以允许同时进行多个分配。但是,一旦我尝试使用变量,它就会报告“未定义变量”错误。这是我迄今为止尝试过的两种方法:

proc set args {
    uplevel foreach {*}$args break
}
proc set {l1 l2} {
    uplevel foreach $l1 $l2 break
}

我对

llength
执行了
$args
,它确实报告了两个元素的列表。我对这种行为很困惑。

我这样称呼它:

set {a b c d} {e f g h}
set {a s d f} {q w e r t y}

*编辑:

对它做了更多修改。我找到了一种让它工作的方法(在大多数情况下,因为额外的值被默默地丢弃,但这与原来的问题无关),但我仍然很困惑为什么这种方法有效,但其他方法却没有:

proc set {l L} {
    uplevel foreach [list $l] [list $L] break
}
foreach set tcl uplevel
1个回答
0
投票

uplevel
加入它的参数 ,就好像它们已被传递给
concat
,除其他外,它说

如果所有参数都是列表,则这与将它们连接成一个列表具有相同的效果。

所以你的第一个版本就变成了

foreach a b c d e f g h break

a
设置为 b,将
c
设置为 d,依此类推。你的第二个版本最终会做同样的事情;这两个列表被展平,它们的元素成为
foreach
的单独参数。第三个版本,将参数包装在
list
中,成为您想要的

foreach {a b c d} {e f g h} break

外部列表被删除,但内部列表保留。


顺便说一句,我会使用与

set
不同的名称,或者在非全局命名空间中定义,除非您还打算支持返回变量当前值的
set
的单参数版本。这样就不会那么混乱了。

© www.soinside.com 2019 - 2024. All rights reserved.