【问题标题】:how to pass a list to a proc in TCL?如何将列表传递给 TCL 中的 proc?
【发布时间】:2013-04-24 23:21:03
【问题描述】:

似乎是一个基本问题,但我在任何地方都找不到答案:-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

还有什么建议吗?

【问题讨论】:

    标签: list arguments tcl proc


    【解决方案1】:

    你的问题是参数名称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}
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2011-11-14
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多