我正在重新定义 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
}
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
的单参数版本。这样就不会那么混乱了。