使用proc在Tcl中复制参数

使用proc在Tcl中复制参数,tcl,proc-object,Tcl,Proc Object,我想创建几个对象,所有对象都具有相同的参数,所以我尝试将它们存储在一个返回它们的进程中。但是解释器将返回的结果作为一个参数而不是几个参数进行评估。我的程序是: proc element_param {} { return "-filled 1\ -visible 1\ -linewidth 1\ -linecolor yellow\ -fillcolor yellow\ -relief roundraised

我想创建几个对象,所有对象都具有相同的参数,所以我尝试将它们存储在一个返回它们的进程中。但是解释器将返回的结果作为一个参数而不是几个参数进行评估。我的程序是:

proc element_param {} {
    return "-filled 1\
        -visible 1\
        -linewidth 1\
        -linecolor yellow\
        -fillcolor yellow\
        -relief roundraised\
        -linewidth 2"
}
我将其用于:

$this/zinc add rectangle 1 [list "100" "100" "200" "200"] [element_param]

如何将它们转换为几个不同的参数?

对于tcl 8.5及更高版本,使用{*}运算符展开参数列表:

$this/zinc add rectangle 1 $coords {*}[element_param]
对于以前的版本,您可以使用eval展开列表:

eval [linsert [element_param] 0 $this/zinc add rectangle 1 $coords]

这与tcl 8.5及更高版本相当。

使用{*}运算符展开参数列表:

$this/zinc add rectangle 1 $coords {*}[element_param]
对于以前的版本,您可以使用eval展开列表:

eval [linsert [element_param] 0 $this/zinc add rectangle 1 $coords]

这是等效的。

或:
eval[list$this/zing add rectangle 1$coords][element\u param]
因为它是一个返回的列表,即使它是以一种可怕的方式构建的。@Donal Fellows,为什么它是以一种可怕的方式构建的,还有什么更好的方式构建它?@Ilya:最好使用
list
命令,因为如果您决定需要在中包含空格的选项(例如),那么引用是正确的。虽然手工引用这些东西是可能的,但这是非常不鼓励的,因为它很容易出错;使用
list
(或生成列表的其他命令之一)并自动为您正确完成。或者:
eval[list$this/zing add rectangle 1$coords][element_param]
,因为它是一个返回的列表,即使它是以可怕的方式构建的。@Donal Fellows,为什么它是以可怕的方式构建的,还有什么更好的方法来构建它呢?@Ilya:最好使用
list
命令,因为如果您决定需要在中包含空格的选项,那么引用就可以了(例如)。虽然手工引用这些东西是可能的,但这是非常不鼓励的,因为它很容易出错;使用
list
(或生成列表的其他命令之一)并自动为您正确完成。