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]
}
如果我们用一些值调用 A
,B
将收到打包在列表中的这些值。此列表是 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
}
现在,如果我们调用 A
,A
的每个参数将成为 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。
我尝试在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]
}
如果我们用一些值调用 A
,B
将收到打包在列表中的这些值。此列表是 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
}
现在,如果我们调用 A
,A
的每个参数将成为 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。