在TCL中将proc名称和参数作为列表传递

时间:2018-01-26 16:34:18

标签: list arguments tcl proc

我有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 !!!

1 个答案:

答案 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有一个参数列表 是一个单词列表,而不是一个列表的参数,所以我避免使用 列表除了作为对特定结构的引用外。)