TCL,接收args作为参数并将其传递给另一个过程

时间:2016-02-16 17:08:28

标签: tcl tk

我尝试在TCL中执行以下操作并出现以下错误 “list必须是偶数个元素”,因为$ args在传递给B时被视为一个列表。

是否有一种巧妙的方式将$ args传递给B?

proc A {a args} {        
    #call B and pass it args
    B 2 $args
}

proc B {b args} {
    set options(-flag1)  0
    set options(-option) serial

    array set options $args
    #use options
}

1 个答案:

答案 0 :(得分:3)

试试这个:

B 2 {*}$args

如果我们简化程序:

proc A args {
    puts [info level 0]
    B $args
}
proc B args {
    puts [info level 0]
}

如果我们使用某些值调用AB将会收到打包在列表中的值。此列表是args中的单个项目,不适合传递给array set,因为该命令需要一个偶数大小的列表。

% A a b c d
A a b c d
B {a b c d}

B的调用更改为:

proc A args {
    puts [info level 0]
    B {*}$args
}

现在,如果我们调用AA的每个参数都将成为B的独特参数,$args现在可以用作array set的参数1}}。

% A a b c d
A a b c d
B a b c d

正如nurdglaw所指出的,Tcl 8.4或更早版本没有{*}语法,这意味着必须使用eval来调用B。一种方法是

eval [linsert $args 0 B]

但也可以使用稍微不那么安全的(它可能会导致参数结构丢失)

eval B $args

不再支持Tcl 8.4,并且有充分的理由升级到8.5或8.6。

文档:evalinfolinsertprocputs{*}