【问题标题】:Tcl global variables in proc declarationproc声明中的Tcl全局变量
【发布时间】:2012-02-21 21:30:40
【问题描述】:

所以我有这段继承的 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参数的默认值。但是,它没有按预期工作,我找不到如何正确编写它,假设它甚至可能。

哪种语法是正确的?

感谢您的帮助。

【问题讨论】:

    标签: tcl


    【解决方案1】:

    嗯,这是正确的:

    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"
        }
    }
    

    【讨论】:

    • 如果您不需要数字比较,请使用符号名称。如果这样做,请使用数组将符号名称映射为数字,以便进行比较。符号是你真正的意思,所以写出来!
    • 所以基本上建议你使用字符串(第三个例子)。我不确定它需要进行多少更改。如果可能的话,我宁愿坚持使用数字。你的第一个例子是如何工作的?
    • 第一个示例使用list 命令而不是使用文字来构造作为参数描述符的嵌套列表结构。第二个示例通过使用info level 0 内省实际参数列表来工作。第三个例子是关于改变游戏规则;老实说,我真的不希望你和那个人一起去。 :–) 最喜欢第二个,因为它也允许动态计算默认值,但第一个没有错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2011-06-30
    相关资源
    最近更新 更多