Tcl and its extensions, Tk and Expect, are powerful tools that allow you greater control over your systems, and easier control of interactions between systems.
This the primary starting point for those looking to learn Tcl. Is there a topic you feel should be discussed but which often isn't? Add it to one of the categories below!
RS: A hint not only for beginners: due to its interactive nature, Tcl itself is a very good teacher. Start up an interactive tclsh (i.e. not specifying a script file). Type commands in, see how it reacts. Make intentional errors (you can hardly break anything). Read the error messages, they're very often very helpful.
LV: I would, however, suggest that they could locate and use tkcon, if tclsh's minimalistic interface is difficult to use. Also, if you are using vanillatclsh, read up on the history command.
It's always a good idea to search this wiki and the Internet for answers first. If good information is not to be found, the following resources provide information on where and how to ask for help. Also check out Effective ways to request help with Tcl-related problems.
An interactive learning tool and development environment for Tcl/Tk.
Key Concepts
The following list might be better suited for some other page, but until a better home is found, it lives here. This is a list of are concepts that have proven vital for a good working understanding of Tcl, and should help to get one's bearings if new to the language:
Every value in Tcl is a string, and each command decides on its own how to interpret the values it receives as arguments. Because every value is a string, Tcl and its extensions often expose external resources and data structures as handles, i.e., a string naming the resource. open, for example, returns a string that can be used as the handle for an open file.
Double quotes are not a string contructor
Every value already is a string. Double quotes, braces, and the backslash character merely escape the special meaning of various characters in Tcl syntax, indicating that whitespace, $, or [, ", {, or \ charactes are a part of the value rather than a special instruction to Tcl.
Rather, a value is a list if it conforms to the prescribed format of a list, which uses braces and the backslash character as needed to distinguish between items in the list and the whitespace delimiting those items. One of the biggest misconceptions among Tcl script authors is that one can cobble together a list by adding values to a string and separating them with whitespace. The technique appears at first to work for a lot of values, but eventually some value that needs proper quoting turns up. Avoid problems by using list to create a properly-formatted list, and use commmands like lappend and lset to manipulate those lists.
If expr receives one literal string as an argument, its performance is often much better. Also, since expr does its own variable and command substituion, bracing the arguments to expr protects against the perils of double substitution.
An entire script, not just a single command, can go between the brackets. The value of the substitution is the value of the final command in the script.
An array is a collection of variables, while a dict is a list mapping keys to values
Both are fit for various purposes in a script, with some overlap. dict is not intended to replace array, but rather as another useful feature in its own right.
New Tcl programmers are tempted to do gymnastics in their scripts to avoid what they perceive as additional memory costs of passing values around. In fact, Tcl doesn't actually copy the value until modification of the value makes it necessary. the unshared value idiom can be used to avoid the making of a copy when a value is modified.
a command that modifies a value takes as an argument the name of the variable holding the value
This is an example of using a string as a handle, and is the natural way to design a function whose purpose is to modify some value named by the caller. In contrast, commands that simply use the value without modifying it take as an argument the actual value rather than th name of variable holding the value. This pattern is evident throughout the built-in commands.
expr and regexp are examples of this. Tcl was designed as a language for creating domain-specific languages, and this idea permeates Tcl scripts and extensions. Many DSL's share the syntax of Tcl.
It's a more advanced topic, and usually requires a program to be structured quite differently, but a built-in event loop is one of those things that differentiates Tcl from other scripting languages. It is a good idea to learn to take full advantage of the event loop before turning to threads. Those using Tk will find it necessary to get familiar with the event loop in short order.
Tips and Tricks
Important advice, heard from RS: "Tcl is so good in introspection, that you should always have an interactive tclsh around for testing - way faster than c.l.t, and more convenient than reading the man pages, or thinking oneself ;-)"
This is a selection of pages deemd to be particularly intructive for learning Tcl idioms and usage. The Tk page has a similar section specifically for Tk usage
[https://www.lynda.com/Tcl-TK-training-tutorials/2781-0.html] Lynda.com's Tcl/TK Training and Tutorials page. Alas, it consists of a course on [Tkinter].