0

aがグローバル変数である次のコードを検討してください。

% set a 1
1
% # FirstCase 
% if "$a==1" "
       puts >>>>>>>>>>>>>>>>
"
>>>>>>>>>>>>>>>>
% # Second case
% if {$a==1} {
     puts >>>>>>>>>>>>>>>>
}
>>>>>>>>>>>>>>>>

私の最初のケースでは、 でif声明を出しました""。したがって、ここで の置換aが行われます。許容できる。

2 番目のケースでは、 でifステートメントを作成しまし{}た。ここでの置換はどのようにa行われますか? {}は置換しないことを意味しますが、使用されている変数があります。関連するコードでは、if変数のグローバル スタックを探しますaか?

4

2 に答える 2

2

ifコマンド likeは、expr与えられた引数を明示的に置き換えるように設計されています。""二重置換が発生する可能性があるため、グループ化の使用はお勧めできません。

tcl の他のコマンドと同様に、if実際には関数です。グローバル スタックは確認しませんが、代わりに呼び出し元のスタック内の式を評価します。

実際、アップレベルを使用する場合は、独自のバージョンを作成できます。

proc _if_ {expression script} {
    # uplevel causes expr to be evaluated in the caller's stack:
    set condition [uplevel 1 "expr {$expression}"]

    if {$condition} {
        uplevel 1 $script
    }
}
于 2013-09-06T04:36:44.703 に答える