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

TCL, receive args as an argument and pass it to another procedure

我尝试在TCL中执行以下操作,但出现以下错误 "list must be an even number of elements" 因为 $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
}

试试这个:

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 现在可以用作 A 的参数array set.

% 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。

文档:eval, info, linsert, proc, puts, {*}