2012-02-21 309 views
2

所以我有这块继承的Tcl代码。本质上,它具有以下功能:proc声明中的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" 
    } 
} 

我怀疑设计的最初的想法是使用全局变量为日志参数的默认值。然而,它没有像预期的那样工作,我无法正确地写出它,假设它是可能的。

哪种语法是正确的?

谢谢你的帮助。

回答

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

如果您不需要数字比较,使用符号名。如果是这样,请使用数组将符号名称映射为数字以进行比较。符号是你真正的意思,所以写出完全的! – 2012-02-21 22:06:44

+0

所以你基本上建议使用字符串(第三个例子)。我不确定它需要的更改量。如果可能,我宁愿使用数字。 你的第一个例子是如何工作的? – ilya1725 2012-02-21 22:27:22

+0

第一个示例使用'list'命令构造参数描述符的嵌套列表结构,而不是使用文字。第二个例子通过在'info level 0'上反思实际参数列表来工作。第三个例子是关于改变游戏;说实话,我并不真的希望你能跟上那个。 :-) _I_大多更喜欢第二个,因为这也允许动态计算默认值,但第一个没有问题。 – 2012-02-21 22:36:58