16

将列表传递给 Tcl 过程的规范方法是什么?

如果我能得到它,我真的很喜欢它,以便列表自动扩展为可变数量的参数。

所以像:

set a {b c}
myprocedure option1 option2 $a

myprocedure option1 option2 b c

是等价的。

我确定我以前看过这个,但我在网上的任何地方都找不到。任何使这两种情况等效的帮助(和代码)将不胜感激。

这是否被认为是标准的 Tcl 约定。或者我什至是在叫错树?

4

3 回答 3

22

这取决于您使用的 Tcl 版本,但是: 对于 8.5:

set mylist {a b c}
myprocedure option1 option2 {*}$mylist

对于 8.4 及以下版本:

set mylist {a b c}
eval myprocedure option1 option2 $mylist
# or, if option1 and 2 are variables
eval myprocedure [list $option1] [list $option2] $mylist
# or, as Bryan prefers
eval myprocedure \$option1 \$option2 $mylist
于 2009-10-20T19:35:49.750 回答
0

要扩展 RHSeeger 的答案,您可以使用如下特殊args参数对 myprocedure 进行编码:

proc myprocedure {opt1 opt2 args} {
    puts "opt1=$opt1"
    puts "opt2=$opt2"
    puts "args=[list $args]" ;# just use [list] for output formatting
    puts "args has [llength $args] elements"
}
于 2009-10-21T00:31:23.477 回答
0

需要注意的是,将命令传递给catch也可以解决这个问题:

set a {b c}
if [catch "myprocedure option1 option2 $a"] {
    # handle errors
}

这可能只应在您想在代码中处理 myprocedure 中的错误时使用,这样您就不必担心重新抛出任何被捕获的错误。

于 2015-05-15T02:04:29.963 回答