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

Passing proc name and arguments as list in TCL

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

完成任务。谢谢布拉德·拉南!!!

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