私はこのような機能を持っています:
proc test { {isSet "false"} } {
if {isSet == "true"} {
# do something
}
}
false
しかし、このプロシージャを呼び出すとき、またはを渡す方法true
:
test "false" or test false?
あなたはそれを間違っています(isSet
条件if
式で裸の単語を使用しているという事実を無視しますが、これは機能しません)。代わりに
proc test {{isSet "false"}} {
if {$isSet} {
# do something
}
}
test
これにより、好きなようにプロシージャを呼び出すことができます。
test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"
等…
基本的な考え方は、Tcl インタープリターが変数に含まれる値をブール型の値として解釈しようとすることです。isSet
それを行うための一連のルールがあります。
yes
、true
またはon
true です。no
に文字通り等しい文字列は false です。false
off
文字列をブール値として解釈するために適用される規則は、Tcl_GetBoolean()
マニュアルに記載されています。
そして、あなたはあなたの仮定に別の間違いを犯しています.Tclには明示的な文字列とブール型がないため(型がないため) 、スクリプトを二重引用符と中括弧として解析するときのTclインタープリターとまったく同じです"false"
。リテラルの型を指定するためではなく、グループ化のためfalse
に Tcl で使用されます (Tcl にはリテラルがありません)。したがって、これらのアイデアをよりよく理解するために、チュートリアルから始めることをお勧めします。
値のブール値としての解釈について説明したときに言及した型は、Tcl 値の内部にあり、ユーザーには表示されません。はい、内部的に Tcl は値の「ネイティブ」表現をキャッシュするためset x [expr {1 + 2}]
、内部的に割り当てられた値x
は整数型になります。しかし、これは実際には実装の詳細です。