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