将列表传递给Tcl程序

时间:2009-10-20 19:11:27

标签: list arguments tcl

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

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

所以像这样:

set a {b c}
myprocedure option1 option2 $a

myprocedure option1 option2 b c

是等价的。

我相信我之前看过这个,但我无法在网上找到它。任何帮助(和代码)使两个案例等效的将是赞赏。

这被认为是标准的Tcl惯例。或者我甚至吠叫错误的树?

3 个答案:

答案 0 :(得分:20)

这取决于您使用的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

答案 1 :(得分: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"
}

答案 2 :(得分:0)

注意将命令传递给catch可能也会解决此问题:

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

如果你想在代码中处理myprocedure中的错误,这应该只能用于你不必担心重新抛出任何被捕获的错误。