proc声明中的Tcl全局变量

时间:2012-02-21 21:30:40

标签: 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"
    }
}

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

哪种语法正确?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

嗯,这是正确的:

proc v2 [list vimm [list log $LOG_DEBUG]] {
    # ... body same as before
}

但那只是丑陋的。更简洁的方式是:

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

但是Tcl真正的禅是根本不使用数字来代替这个任务,而是命名:

proc v2 {vimm {log "debug"}} {
    if {$log eq "debug"} {
        puts "log"
    } else {
        puts "no log"
    }
}