我有proc A,它有三个参数,proc B有灵活数量的参数,因为proc B可以是任何东西。我的问题是如何从进程 A 中调用进程 B.目前我正在做:
proc B {a b c d to n} {
do something that is right since I can call B individually and it works
}
set listB [list B a b c d to n]
proc A {a b listB} {
do something
if {$listB != 0} {
execute proc B
}
}
问题是我无法执行 B。为了执行 B,我尝试了:
$listB
[set listB]
[join $listB " "]
[concat $listB]
所有这些都失败并出现相同的错误,因为对于 TCL,我正在尝试使用带有名称的命令
"B a b c d to n"
我试图实现的与这里有效的相同:
bind $uf.infid <Return> [list B a b c d to n]
--更新--我应该提到proc B的名称也可以更改,因为我试图使proc A尽可能通用。这就是为什么 proc B 的名称是列表中用作 proc A 参数的第一个元素。不过
{*}$listB
做这项工作。谢谢布拉德·拉纳姆!!
proc A 接受三个参数,两个正常参数和一个列表参数。proc B 接受多个参数,而不是列表参数。
考虑到传递给proc B的大量参数,我认为你最好重写过程 B 以接受作为列表的参数。
通常,如果您有一个列表并且需要传递各个参数到过程中,使用展开运算符{*}
展开列表变成一组单独的单词。
proc A { a b listB } {
B {*}$listB
}
在旧版本的 Tcl 中,需要 eval 运算符
proc A { a b listB } {
eval B $listB
}
如果重写进程 B
proc B { mylist } {
foreach {val} $mylist {
...
}
}
proc A { a b listB } {
B $listB
}
(谈论起来可能会非常混乱,因为 B 有一个参数列表是一个单词列表,而不是一个列表的参数,所以我避免使用列表,除非作为对特定结构的引用。