如何将列表传递给TCL中的proc?

时间:2013-04-30 22:33:49

标签: list arguments tcl proc

似乎是一个基本问题,但我无法在任何地方找到答案:-S

我对下面的实验感到困惑:

Tcl 8.5.13 interactive shell
% set args [list 1 2 3]
1 2 3
% llength $args
3
% set argv $args
1 2 3
% llength $argv
3
% set argv ${args}
1 2 3
% llength $argv
3

到目前为止一直很好,但随后:

% proc test { args } { set argv ${args}; set argc [llength $argv]; return $argc}
% test $args
1

看起来列表在参数传递期间变成了一个字符串。 谁能解释一下这里发生了什么?

到目前为止我找到的唯一解决方法就是这个:

% proc test2 { argsName } { upvar 1 $argsName args; set argv ${args}; set argc [llength $argv]; return $argc}
% test2 args
3

还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

您的问题是参数名args,它具有特殊含义。

来自manual of proc

  

如果最后一个正式参数的名称为 args ,则对该过程的调用可能包含比过程具有正式参数更多的实际参数。在这种情况下,从将分配给 args 的所有实际参数组合成一个列表(就像使用了list命令一样);此组合值将分配给局部变量 args

因此,如果您为参数使用任何其他名称,它将正常工作。


args的使用示例:

proc putargs args {
    puts $args
}

# Call with more than one argument
putargs foo bar
# Use as command prefix for callbacks.
trace add execution glob {enter leave} {list putargs GLOB}