用于默认值分配的TCL proc

用于默认值分配的TCL proc,tcl,Tcl,tcl中的proc的语法是什么?如果用户不提供任何参数,它会自动接受参数 我用了类似 proc a {{args 1}} { puts $args } a 当我使用这个时,我不能得到args值为1。它返回一个空白字符串。请帮我解决这个问题。args是一个保留字,在proc定义中有特定含义。使用不同的变量名: proc a {{x 1}} { puts $x } a 补充答复 在proc定义中,通过将参数定义为包含两个成员的列表来提供默认值:第一个是

tcl中的proc的语法是什么?如果用户不提供任何参数,它会自动接受参数

我用了类似

    proc a {{args 1}} {
    puts $args
    }

    a
当我使用这个时,我不能得到args值为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)
如果您的用例符合此模式,那么您可以在arg之前使用默认值定义参数,如上面的示例所示。如果没有,那么您唯一的选择就是自己处理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
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)
如果您的用例符合此模式,那么您可以在arg之前使用默认值定义参数,如上面的示例所示。如果没有,那么您唯一的选择就是自己处理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

听起来你想一起做两件不同的事情:

接受进程中数量可变的参数 如果未提供参数,请使用默认值 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命令返回调用时正在运行的实际命令,并带有参数。因此,如果其结果的长度小于2,我们知道调用当前命令时没有参数,因为列表中的第一个元素是实际的命令名本身。

听起来像是要一起做两件不同的事情:

接受进程中数量可变的参数 如果未提供参数,请使用默认值 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命令返回调用时正在运行的实际命令,并带有参数。因此,如果结果的长度小于2,我们知道调用当前命令时没有参数,因为列表中的第一个元素是实际的命令名本身。

谢谢!但如果我是对的,args本身就可以将值列表带到proc。我对这个进程的输入来自另一个进程,它可以提供任意数量的参数。如何处理此问题?例如,a 1 2 3 4 5只有在使用参数时才起作用。当前的过程实现严格按照从左到右的方式将实际参数分配给形式参数。这意味着没有理由将一个形式参数的默认值放在另一个形式参数之前;这将被忽略,并可能导致混淆错误消息。而且,args只有在它是最后一个形式参数时才是特殊的;其他任何地方,这只是一个正常的正式仪式。谢谢!但如果我是对的,args本身就可以将值列表带到proc。我对这个进程的输入来自另一个进程,它可以提供任意数量的参数。如何处理此问题?例如,a 1 2 3 4 5只有在使用参数时才起作用。当前的过程实现严格按照从左到右的方式将实际参数分配给形式参数。这意味着没有理由将一个形式参数的默认值放在另一个形式参数之前;这将被忽略,并可能导致混淆错误消息。而且,args只是特殊的w 当它是最后一个正式论点时;这只是一个普通的正式场合。