If someone asks me of a small snippet that describes some fundamental thing about TCL, I will respond with this:
set a puts
$a "Hello World"
A command is just a list. Substitution is done before executing it. That's why [set] requires the variable name, not $variable.