带有可选参数的 TCL 过程调用

vas*_*111 2 tcl

有一个 TCL 脚本,它func在不同的命名空间中有多个具有相似名称的过程定义。程序如下所示:

proc func {a} {
    puts $a
}
Run Code Online (Sandbox Code Playgroud)

所有那种程序只有一个参数a。所有这些类型的过程都是从整个脚本的一行中调用的:

func $a
Run Code Online (Sandbox Code Playgroud)

我需要func在其他命名空间中创建另一个具有相似名称的过程定义。但该过程将有两个参数。该过程也需要从与其他同名过程相同的行调用。程序如下所示:

proc func {a b} {
    puts $a
    puts $b
}
Run Code Online (Sandbox Code Playgroud)

我现在需要修改调用所有这些过程的行,func $a以便它可以调用所有具有一个参数的过程和具有两个参数的新过程。但是不能更改带有一个参数的过程定义。调用所有这些程序的行func $a应该是什么样的?

Don*_*ows 10

如果你想要一个可选参数,并且你知道如果没有提供可选值应该是什么,你可以这样做:

proc func {a {b "the default"}} {
    puts "a is $a"
    puts "b is $b"
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在运行时计算默认值,最简单的技术是在实际输入中不太可能出现的魔法哨兵值。比如两个ASCII NUL字符(== Unicode U+000000):

proc func {a {b "\u0000\u0000"}} {
    if {$b eq "\u0000\u0000"} {
        set b "default:$a"
    }
    puts "a is $a"
    puts "b is $b"
}
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用魔法args值来获取完整的参数列表并“手动”完成所有工作:

proc func {a args} {
    if {[llength $args] == 0} {
        set b "the default..."
    } elseif {[llength $args] == 1} {
        set b [lindex $args 0]
    } else {
        error "bad number of arguments!"
    }
    puts "a is $a"
    puts "b is $b"
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,info level内省者可以提供帮助,但事情可能会变得复杂......