2012-02-21 15 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" 
    } 
} 

は、私が設計し、元のアイデアはログパラメータのデフォルト値のためのグローバル変数を使用していたと思われます。しかし、それは期待どおりに動作していないと私はそれを可能と仮定して、正しく書く方法を見つけることができません。

正しい構文は次のとおりです。

ありがとうございました。

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

しかし、それはただ醜いです:

答えて

5

まあ、これは正しいだろう。

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

あなたが数値比較を必要としない場合は、シンボリック使用します名前。その場合は、配列を使ってシンボリック名を数値だけにマップして比較します。シンボルはあなたが本当に意味するものなので、正確に記述してください! –

+0

基本的には文字列を使用することをお勧めします(3番目の例)。私はそれが必要となる変更の量についてはわかりません。可能であれば、私はむしろ数字に固執したいと思う。 最初の例はどのように正確に機能しますか? – ilya1725

+0

最初の例は、リテラルを使用する代わりに 'list'コマンドを使用して引数記述子であるネストされたリスト構造を構築します。 2番目の例は、実際の引数のリストを 'info level 0'でイントロスペクトすることによって動作します。 3番目の例は、ゲームの変更についてです。私は本当にあなたがその人と一緒に行こうとは思っていません。正直です。 :-) _I_は、動的に計算されたデフォルトを可能にするので、ほとんどは2番目のものを好むが、最初のものに間違いはない。 –