中括弧{}
、および括弧 、()
はTcl では交換できません。
正式には、中括弧は ( 1 つの例外を除いて) 内容に対してそれ以上の置換が実行されないことを示す一種の引用です。上記の最初のケースでは、これはその引数がif
式として評価される置換なしで に渡されることを意味します。式サブ言語には、一般的な Tcl と非常によく似たブレース解釈スキームがあります。それらは、それ以上の置換を実行する必要のないリテラル値を示します。
対照的に、括弧はほとんど Tcl では特別ではありません。例外は、配列の要素の名前 (例: $foo(bar)
)、式サブ言語 (プログラミング全体で数式のようにグループ化に使用される)、および正規表現サブ言語 (異なるタイプのグループ化と他にもいくつか)。Tcl のコマンド名の一部として括弧を使用することは完全に合法です (バランスをとるかどうかにかかわらず)。
詳細
この特定のケースでは、 this のテスト式if
:
if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {...}
次のように解析されます。
何とか#1 LOGICAL_OR何とか#2
ここで、それぞれblah
はリテラルです。残念ながら、blah#1
(これは とまったく同じです$number == 1 && $name == "hello"
) にはブール値の解釈がありません。(そうではありませんがblah#2
、私たちはそれを気にすることは決してありません。) ここでは間違いなく非常に悪い方向に進んでいます!
最も簡単な修正は、これらの偽の中括弧を括弧に戻すことです。
if {($number == 1 && $name == "hello") || ($number == 0&&$name == "yes")} {...}
これはあなたが最初に望んでいたものだと思います。
警告: 高度なトピック
ただし、他の修正は、少し余分に追加することです。
if {[expr {$number == 1 && $name == "hello"}] || [expr {$number == 0&&$name == "yes"}]} {...}
これは通常は良い考えではありません — 追加のゲインがないのに余分なバルク — しかし、動的に生成された式をテスト条件として使用しようとしている場合には意味があります。これを行う必要があることが本当に確実でない限り、これを行わないでください。私は真剣です。これは非常に高度なテクニックであり、ほとんど必要としないものであり、多くの場合、全体的な目標を達成するためのより良い方法があります. あなたがそれを必要とするかもしれないと思うなら、善のためにここでSOに尋ねてください。私たちはより良い方法を見つけようとします; ほとんどの場合、利用可能なものがあります。