2012-02-21 311 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