I'm not as fond of the language as some, primarily because it is unnecessarily hard to debug errors and unnecessarily hard to read code and data.<p>For example the interpreter can basically say "there's a syntax error somewhere in this giant block of yours" and not have <i>any idea</i> where.<p>A related issue is that a single delimiter (the brace) is bad for readability, even if it's easy to parse. Just try reading a gigantic dictionary; it isn't anywhere near as clear as Python/JSON-style can be (where there are obvious commas, colons, quoted strings and more to show you exactly what you're looking at).<p>Another headache for debugging is that commands frequently accept the <i>names</i> of variables. In unfamiliar code you can't even answer simple questions like "where are all the places 'xyz' is used?" because a reference to 'xyz' could be hiding almost anywhere. You can change something and not fully understand the effects that your change could have. While I'm sure this allows for very clever code to be quickly <i>written</i>, it fails the more-important test of producing code that is easy to <i>read</i>.<p>It is even possible for commands to silently accept mistakes and seem correct, with major consequences. Suppose "x" just happens to be a one-element list containing a number, '{0}'. With this input, "lindex 0 $x" is legal (even though "lindex $x 0" is the correct argument order). Worse, the wrong form <i>returns something that seems reasonable without error</i>. In this case what it <i>actually</i> does is grab the index that it found by magically looking inside the <i>list</i> ($x) and return one of the values from <i>the implicit list containing "0" that was given on the command line</i>; it returns a "0" but not the "0" that you'd think it does!<p>While one can argue that each language has "best practices" and intended usage, the examples above are largely pulled directly from built-in commands and data types. These are things that people encounter all the time, they are not caused by any particular TCL programming practice.