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

TCL,接收参数作为参数,并将其传递给另一个过程,tcl,tk,Tcl,Tk,我尝试在TCL中执行以下操作,但得到了以下错误 “列表必须是偶数个元素”,因为$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

我尝试在TCL中执行以下操作,但得到了以下错误 “列表必须是偶数个元素”,因为$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]
}
如果我们使用一些值调用
A
B
将接收打包在列表中的那些值。此列表是
args
中的单个项目,不适合传递到
数组集,因为该命令需要大小均匀的列表

% 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
}
现在,如果我们调用
A
A
的每个参数都将成为
B
的一个独立参数,
$args
现在可以用作
数组集
的参数

% 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]
但也可以使用稍不安全的(这可能会导致失去论点结构)

Tcl 8.4不再受支持,完全有理由升级到8.5或8.6

文档:,,

尝试以下操作:

B 2 {*}$args
如果我们稍微简化一下程序:

proc A args {
    puts [info level 0]
    B $args
}
proc B args {
    puts [info level 0]
}
如果我们使用一些值调用
A
B
将接收打包在列表中的那些值。此列表是
args
中的单个项目,不适合传递到
数组集,因为该命令需要大小均匀的列表

% 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
}
现在,如果我们调用
A
A
的每个参数都将成为
B
的一个独立参数,
$args
现在可以用作
数组集
的参数

% 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]
但也可以使用稍不安全的(这可能会导致失去论点结构)

Tcl 8.4不再受支持,完全有理由升级到8.5或8.6


文档:,,,

您是否正在使用
数组集
命令?分享完整的代码。@Dinesh我已经更新了代码。你在使用
array set
命令吗?分享完整的代码。在那里你去@Dinesh我已经更新了代码只是为了点最后一个我。。。Tcl 8.5中引入了
{*}
操作符。如果您确实必须使用早期版本,则需要通过更加不透明的
eval[linsert$args 0 B]
-调用B,该函数创建一个包含B和所有单个参数的新列表,然后将该列表作为命令进行求值。鉴于
args
保证是一个正确的列表,您可以使用
eval[名单B]$args
。它比
linsert
版本更容易理解。但肯定是升级了,因为8.4不再受支持。该死!!彼得和@nurdglaw,我真是太感谢你了。挽救了我的一天。关于这个版本,我正在使用8.3。我刚开始为一家大公司工作,我不拥有代码。我认为他们不会这么做ant将很快升级。但我会问。只是为了点画最后一个I…Tcl 8.5中引入了
{*}
操作符。如果您确实必须使用早期版本,则需要通过更不透明的
eval[linsert$args 0 B]调用B
-它创建一个包含B和所有单个参数的新列表,然后将该列表作为命令进行计算。假定它是
args
,保证是一个正确的列表,您可以使用
eval[list B]$args
。它比
linsert
版本更容易理解。但肯定是升级了,因为8.4不再受支持。该死!!彼得和@nurdglaw,我真是太感谢你了。挽救了我的一天。关于这个版本,我正在使用8.3。我刚开始为一家大公司工作,我不拥有代码。我认为他们不会这么做蚂蚁很快就会升级,但我会问的。