proc声明中的Tcl全局变量

ily*_*725 2 tcl

所以我有一块继承的Tcl代码.基本上它执行以下操作:

set LOG_ALL     0
set LOG_DEBUG   1
set LOG_INFO    2
set LOG_WARN    3
set LOG_ERROR   4
set LOG_FATAL   5
set LOG_SILENT  6

proc v2 {vimm {log LOG_DEBUG}} {
    global LOG_DEBUG
    if {$log == $LOG_DEBUG} {
        puts "log"
    } else {
        puts "no log"
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑设计的最初想法是使用全局变量作为log参数的默认值.但是,它没有按预期工作,我无法找到如何正确编写,假设它甚至可能.

哪种语法是正确的?

谢谢你的帮助.

Don*_*ows 5

嗯,这是正确的:

proc v2 [list vimm [list log $LOG_DEBUG]] {
    # ... body same as before
}
Run Code Online (Sandbox Code Playgroud)

但那只是丑陋的.更简洁的方法是:

proc v2 {vimm {log ""}} {  # Any dummy value would do...
    global LOG_DEBUG
    if {[llength [info level 0]] < 3} {
        set log $LOG_DEBUG
    }
    # ... as before
}
Run Code Online (Sandbox Code Playgroud)

但是Tcl真正的禅是根本不使用数字来完成这项任务,而是命名:

proc v2 {vimm {log "debug"}} {
    if {$log eq "debug"} {
        puts "log"
    } else {
        puts "no log"
    }
}
Run Code Online (Sandbox Code Playgroud)