True or False. Tcl has no separate Boolean type, like in C, the integers 0 (false) and 1 (true - in fact any nonzero integer) are used. [NEM]: Although [expr] will also accept "true" and "false" (and "yes"/"no"..) as Boolean values. [1S] In fact, there's no separate Integer type in [Tcl] as well -- everything is a string. A proper boolean value is either a proper integer, with, like in [C], zero meaning false and non-zero meaning true, or one of the following: '''yes''', '''no''', '''true''', '''false''', '''on''', or '''off'''. [RS] The canonical forms however, like [expr] produces them, are 1 and 0. See [Boolean Logic] or [Integers as Boolean Functions]. ---- <> Boolean and the comparision operators '''==''' and '''!=''' [HaO] 2011-05-02 Comparisions with '''==''' or '''!=''' do not work with booleans not in canonical form: ====== % expr {true == 1} 0 ====== This issue may be avoided using the '''bool()''' function to bring strings in boolean canonical form: ====== % expr {bool(true) == bool(1)} 1 ====== This is only recommeded if two variables contain boolean data. ====== expr {bool($b1) == bool($b2)} ====== otherwise, one would use: ====== expr { $b1 } expr { ! $b1 } ====== <> ---- [MG] The [string is] command also recognises booleans: ====== proc trueorfalse {str} { if { ![string is boolean -strict $str] } { return -1; # not a boolean } return [string is true $str] } % trueorfalse foo -1 % trueorfalse yes 1 % trueorfalse off 0 ====== ---- [hv] Here is my little script which lists which token is true, false, or neither: # # Which token is considered true/false? # set tokens {-2 -1 0 1 2 yes no Yes No YES NO on off On Off ON OFF true false True False TRUE FALSE Y N OK FAIL} set trueTokens {} set falseTokens {} set neitherTokens {} foreach token $tokens { if {[string is true -strict $token]} { lappend trueTokens $token } else { if {[string is false -strict $token]} { lappend falseTokens $token } else { lappend neitherTokens $token } } } puts "True: $trueTokens" puts "False: $falseTokens" puts "Neither: $neitherTokens" Output: True: 1 yes Yes YES on On ON true True TRUE Y False:0 no No NO off Off OFF false False FALSE N Neither: -2 -1 2 OK FAIL [AMG]: Why does [[string is boolean]] reject "2" when it valid to use "2" anywhere a Boolean is expected? Also, in addition to the strings tested above by [HV]'s code, [[string is boolean]] accepts all capitalizations of: `t`, `tr`, `tru`, `f`, `fa`, `fal`, `fals`, `ye`, and `of`. Notably, `o` is ''not'' accepted, since it is a common prefix shared by `on` and `off`. <> Glossary