我有proc A,有三个参数,proc B有一个灵活的参数,因为proc B可以是任何东西。我的问题是如何从proc A中调用proc 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
完成这项工作。谢谢Brad Lanam !!!
答案 0 :(得分:1)
proc A接受三个参数,两个普通参数和一个列表。 proc B接受多个参数,而不是列表的参数。
考虑到传递给proc B的大量参数,我想你 最好重写proc B来接受一个列表的参数。
通常,如果您有一个列表,则需要传递单个参数
对于过程,您使用扩展运算符{*}
来展开列表
分成一组单词。
proc A { a b listB } {
B {*}$listB
}
在早期版本的Tcl中,需要使用eval运算符
proc A { a b listB } {
eval B $listB
}
如果重写了proc B
proc B { mylist } {
foreach {val} $mylist {
...
}
}
proc A { a b listB } {
B $listB
}
(这可能会让人很困惑,因为B有一个参数列表 是一个单词列表,而不是一个列表的参数,所以我避免使用 列表除了作为对特定结构的引用外。)