我正在重新定义 Tcl 的set
命令以允许同时进行多个分配。但是,一旦我尝试使用变量,它就会报告“未定义变量”错误。这是我迄今为止尝试过的两种方法:
proc set args {
uplevel foreach {*}$args break
}
proc set {l1 l2} {
uplevel foreach $l1 $l2 break
}
我执行了llength
on $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
,除其他外,它说所以你的第一个版本就变成了
将设置
a
设置为b,c
设置为d,依此类推。你的第二个版本最终会做同样的事情;这两个列表被展平,它们的元素成为 的单独参数foreach
。第三个版本将参数包装在 中list
,成为您想要的外部列表被删除,但内部列表仍然保留。
顺便说一句,我会使用与 不同的名称
set
,或者在非全局命名空间中定义它,除非您还打算支持set
返回变量当前值的单参数版本。这样就不会那么混乱了。