** Summary ** A '''gotcha''' is an ''unexpected side effect, behavior, consequence, requirement, etc.'' ** Description ** As with any language, the syntax and semantics of [Tcl] can catch the programmer off guard. This page is an attempt to enumerate constructs and behaviour's that can be construed as '''gotcha'''s. ---- **Gotchas** *** [Tcl and octal numbers%|%The Octabug%|%] *** See [Tcl and octal numbers] *** Working [list%|%Lists%|%] *** Another Tcl '''gotcha''' is to hand arbitrary strings, read from the user or a file/command, directly into a list operation without first ensuring that the contents is, in actuality, a [list]. [DKF]: The best way to deal with such user input, where users aren't expecting to write a Tcl list in the first place, is to use a sanitizing command to convert the input into a proper list. Examples of sanitization commands can include [split], [splitx] and (my favorite) this: ====== set elements [regexp -all -inline {\S+} $line] ====== *** Switch its Arguments *** [RS] One possible gotcha is [switch] -- always use "--" before the switch variable, since if the value of the switch variable starts with "-", you'll get a syntax error. [AMG]: This isn't required by Tcl 8.5 onward. *** Delimiting Options from Argumennts *** [KPV] Also, [comment]s w/i [switch], while possible, are tricky. [RS] 2010-05-10 A similar gotcha is in the '''[text] search''' subcommand - although the misunderstanding could be avoided by counting non-optional arguments from the end, ====== set whatever -this $t search $whatever 1.0 ====== raises an error that "-this" is an undefined switch. For robustness, use ====== $t search -- $whatever 1.0 ====== if the slightest possibility exists that $whatever might start with a dash. *** Intepretations by [expr] *** [RS] 2010-02-24: Yet another gotcha we ran into last night: Consider a function ====== proc f x { if {$x == 00000000} { puts "$x is NULL" } } ====== which reported: ======none 0E123456 is NULL ====== How so? Bug? No -- feature. With the [==] comparison operator, the operands are tried to match as integers, floats, or then as strings. And the $x in this case, though meant as a pointer in hex, could be parsed as float - with the numeric value of 0, which is numerically equivalent to 00000000. The solution of course was to use the [eq] operator instead. [AMG]: Another issue with expr interpreting stuff happens when said stuff was already interpreted by Tcl. This creates performance, security, and correctness problems. Always [brace your expr-essions]! *** [[[set]]] and namespaces *** [Twylite] 2012-12-12: Setting a variable in a '''namespace eval''' can clobber a global variable. See [Dangers of creative writing]. ====== set foo 10 namespace eval bar { set foo 20 ; set bar 30 } puts $foo ;# puts: 20 puts $bar ;# error: can't read "bar": no such variable ====== <> Glossary