将列表传递给 Tcl 过程的规范方法是什么?
如果我能得到它,我真的很喜欢它,以便列表自动扩展为可变数量的参数。
所以像:
set a {b c}
myprocedure option1 option2 $a
和
myprocedure option1 option2 b c
是等价的。
我确定我以前看过这个,但我在网上的任何地方都找不到。任何使这两种情况等效的帮助(和代码)将不胜感激。
这是否被认为是标准的 Tcl 约定。或者我什至是在叫错树?
这取决于您使用的 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
要扩展 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"
}
需要注意的是,将命令传递给catch也可以解决这个问题:
set a {b c}
if [catch "myprocedure option1 option2 $a"] {
# handle errors
}
这可能只应在您想在代码中处理 myprocedure 中的错误时使用,这样您就不必担心重新抛出任何被捕获的错误。