将列表传递给Tcl过程的规范方法是什么?
我真的很喜欢它,如果我能得到它,以便列表自动扩展为可变数量的参数。
所以像这样:
set a {b c}
myprocedure option1 option2 $a
和
myprocedure option1 option2 b c
是等价的。
我相信我之前看过这个,但我无法在网上找到它。任何帮助(和代码)使两个案例等效的将是赞赏。
这被认为是标准的Tcl惯例。或者我甚至吠叫错误的树?
答案 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中的错误,这应该只能用于你不必担心重新抛出任何被捕获的错误。