TCL proc用于默认值赋值

时间:2012-12-05 03:19:26

标签: tcl

如果用户没有给出任何arg,tcl中的proc会自动获取参数的语法是什么?

我使用了像

这样的东西
    proc a {{args 1}} {
    puts $args
    }

    a

当我使用它时,我将我的args值设为1.它返回一个空字符串。请帮帮我。

2 个答案:

答案 0 :(得分:3)

听起来你正试图一起做两件事:

  1. 接受proc的可变数量的参数
  2. 如果未提供参数,请使用默认值
  3. proc并没有真正的语法来处理这种情况。但是,它很容易实现。您可以接受可变数量的参数(args关键字),然后检查是否提供了任何参数(如果没有,则使用默认值)。

    proc myproc {args} {
        if { [llength [info level 0]] < 2 } { #called with no args
            set args {the default list of values}
        }
        # rest of the code goes here
    }
    

    info level 0命令返回正在调用的实际命令,带有参数。因此,如果它的结果​​的长度是&lt; 2,我们知道当前命令是在没有参数的情况下调用的(因为列表中的第一个元素是实际的命令名称本身)。

答案 1 :(得分:1)

单词args是一个保留字,在proc定义中具有特定含义。使用其他变量名称:

proc a {{x 1}} {
    puts $x
}

a

补充答案

在proc定义中,默认值是通过将参数定义为具有两个成员的列表给出的:第一个是参数的名称,第二个是默认值。

单词args是一个特殊的参数,它实现了rest参数(也就是说,它捕获了参数列表中未指定的剩余参数)。这就是人们如何在Tcl中实现可变参数函数。

定义过程时,args参数和默认值可以一起使用。但是args不能有默认值。 args之前列出的任何参数都可以具有默认值。但是,必须在没有默认值的参数之后列出具有默认值的参数。所以,基本上你可以写一个这样的函数:

proc a {x {y 1} args} {
    puts "$x $y ($args)"
}
a 1       ;# prints 1 1 ()
a 1 2     ;# prints 1 2 ()
a 1 2 3 4 ;# prints 1 2 (3 4)

如果您的用例符合此模式,那么您可以在args之前使用默认值定义参数,如上例所示。如果没有,那么您唯一的选择就是自己处理args

# Assume parameters are key-value pairs,
# if value not given then default to 1
proc b args {
    foreach {x y} $args {
        if {$y == ""} { set y 1 }
        puts "$x -> $y"
    }
}
b 1 2    ;# prints 1 -> 2
b 1 2 3  ;# prints 1 -> 2, 3 -> 1