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



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

最新更新