List 将列表传递给Tcl过程

List 将列表传递给Tcl过程,list,arguments,tcl,List,Arguments,Tcl,将列表传递给Tcl过程的规范方法是什么 我真的很喜欢它,如果我可以得到它,使一个列表自动扩展成一个可变数量的参数 比如: set a {b c} myprocedure option1 option2 $a 及 它们是等价的 我肯定我以前看过,但我在网上找不到。任何帮助(和代码)使这两种情况等同将不胜感激 这是否被视为标准的Tcl约定。还是我找错了方向?这取决于您使用的Tcl版本,但是: 对于8.5: 对于8.4及以下版本: set mylist {a b c} eval myprocedur

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

我真的很喜欢它,如果我可以得到它,使一个列表自动扩展成一个可变数量的参数

比如:

set a {b c}
myprocedure option1 option2 $a

它们是等价的

我肯定我以前看过,但我在网上找不到。任何帮助(和代码)使这两种情况等同将不胜感激


这是否被视为标准的Tcl约定。还是我找错了方向?

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

对于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"
}

请注意,将命令传递给也将解决此问题:

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

只有当您想在代码的这一点上处理myprocedure中的错误时,才应该使用此选项,这样您就不必担心重新引用捕获到的任何错误。

。。。虽然我个人认为\$option1\$option2比[list$option1][list$option2]更可取。它更清楚地显示了您的意图——您的意图不是创建一个元素列表,您的意图是防止(或防止)对这些变量进行额外的替换。8.4及以下版本的标准方法是:
eval[linsert$mylist 0 myprocedure options 1 option 2]
我不同意这是标准的(但也许我们有不同的标准?)。它可以说是最安全的,但它的可读性不如\$option1\$option2,并且再次模糊了您实际要实现的目标。应该注意的是,8.5(及更高版本)的扩展语法强烈建议使用,因为在此之前,即使是经验丰富的专家也会在安全操作方面遇到麻烦。它还可能更快。Tcl8.5是从Python借用了星号(*),还是从Python借用了星号(*),反之亦然?我不同意您必须编写myprocedure以获取可变数量的参数(即,使用“args”)。你是否这样做完全取决于你是否需要它接受可变数量的输入,而不是取决于某个特定的调用方是如何将其输入提供给它的。你能在你伟大的问题的某个地方加上“展开”(最好是“展开参数”)一词吗?我很难找到它:-)
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"
}
set a {b c}
if [catch "myprocedure option1 option2 $a"] {
    # handle errors
}