As seguintes regras estabelecem a sintaxe e a semântica da linguagem Tcl:[1] ComandosUm script Tcl é composto por uma string que contém um ou mais comandos. O ponto-e-vírgula e o fim da linha são separadores de comandos a menos que estejam entre aspas ou chaves, conforme explicação abaixo. O colchete que fecha um par de colchetes indica o fim de um comando em uma substituição de comando (veja abaixo) a menos que ele esteja entre aspas ou chaves.[2] ExecuçãoComandos são executados em duas etapas. Na primeira passada, o interpretador Tcl divide o comando em palavras e executa substituições conforme explicação abaixo. Essas substituições ocorrem da mesma maneira em todos os comandos. A primeira palavra serve para localizar um procedimento de comando para a execução do comando. Todas as palavras do comando, então, são passadas como argumentos para o procedimento de comando. O procedimento de comando pode interpretar cada uma dessas palavras como quiser: número inteiro, nome de variável, lista ou script Tcl. Comandos diferentes interpretam suas palavras de formas diferentes.[3] PalavrasAs palavras de um comando são separadas por um ou mais espaços ou tabulações (exceto o espaço entre uma linha e outra, que é considerado um separador de comandos).[4] Aspas duplasSe o primeiro caractere de uma palavra for aspas ("), o fim da palavra é demarcado pelo próximo caractere aspas. Se um ponto-e-vírgula ou segundo colchete de um par de colchetes ou espaço (incluindo quebra de linha) estiver entre as aspas, este caractere é tratado como um caractere comum, que faz parte da palavra. Caracteres entre aspas estão sujeitos à substituição de comandos, à substituição de variáveis e à substituição de barras invertidas, de acordo com a explicação abaixo. As aspas duplas não são consideradas parte da palavra.[5] ChavesSe o primeiro caractere de uma palavra for a chave que abre ("{"), o fim da palavra é demarcado pela chave que fecha ("}"). Se houver chave que abre dentro de um par de chaves, para cada nova chave que abre deve haver uma chave que fecha. Mas se qualquer chave (que abre ou fecha) aparecer dentro de uma palavra, entre aspas e com a barra invertida, ela não é considerada no casamento dos pares de chaves. Caracteres expressos entre chaves não estão sujeitos a substituições, exceto a barra invertida seguida de quebra de linha, explicada abaixo. Também não se aplica nenhuma interpretação especial ao ponto-e-vírgula, à quebra de linha, ao colchete que fecha nem ao espaço. A palavra consiste em nada mais e nada menos que os caracteres expressos entre o par de chaves situados nas extremidades da palavra, não incluindo as próprias chaves.[6] Substituição de comandosSe uma palavra contiver o colchete que abre ("["), Tcl aplica a "substituição de comandos". O interpretador Tcl percorre e processa todos os caracteres após o colchete que abre como se eles fossem um script Tcl. Esse script pode conter um número ilimitado de comandos e seu final é demarcado pelo colchete que fecha ("]"). Os colchetes e todos os caracteres expressos entre eles são substituídos pelo resultado do script (i.e. o resultado do seu último comando) dentro da palavra. O número de substituições de comandos que podem ocorrer em cada palavra é ilimitado. A substituição de comandos não se aplica a palavras expressas entre chaves.[7] Substituição de variáveisSe uma palavra contiver o cifrão ("$"), também conhecido como "dólar", Tcl executa a "substituição de variável": o cifrão e os caracteres seguintes na palavra são substituídos pelo valor da variável. A substituição de variável pode ter qualquer um dos seguintes formatos:
$nome"nome" é o nome de uma variável escalar. Esse "nome" é uma seqüência de um ou mais caracteres que podem ser letras, dígitos, sublinhado (_) ou separadores de namespace (o símbolo de dois pontos expresso duas vezes seguidas).
$nome(índice)"nome" é o nome de uma variável array, e "índice" indica o nome de um elemento dentro de array. "nome" deve conter somente letras, dígitos, sublinhado (_) e separadores de namespace, e também pode ser uma string vazia. Os caracteres do índice podem sofrer substituições de comando, variável e barra invertida.
${nome}"nome" é o nome de uma variável escalar. Ele pode conter qualquer caractere menos a chave que fecha.O número de substituições de variável que podem ocorrer em cada palavra é ilimitado. A substituição de variável não se aplica a palavras expressas entre chaves.[8] Substituição de seqüências com barra invertidaA substituição de seqüências com barra invertida ocorre quando uma barra invertida ("\") aparece dentro de uma palavra. Em todos os casos exceto aqueles descritos abaixo, a barra invertida é removida, e o caractere seguinte é tratado como um caractere comum que integra a palavra. Isso permite que caracteres como aspas duplas, o colchete que fecha e o cifrão sejam incluídos nas palavras sem a aplicação de seus significados especiais. A seguinte tabela relaciona as seqüências com barra invertida que são interpretadas de forma especial e o valor que substitui cada seqüência.\a Alerta sonoro (campainha - BEL) (0x07).\b Retrocesso (backspace - BS) (0x08).\f Avanço de formulário (pula página -- FF) (0x0c).\n Quebra de linha (Line Feed - LF) (0x0a).\r Retorno de carro (Carriage Return - CR) (0x0d).\t Tabulação (TAB) (0x09).\v Tabulação vertical (VT) (0x0b).\<quebra de linha><espaço em branco> - Um único espaço substitui a barra invertida, quebra de linha e todas as tabulações após a quebra de linha. A seqüência de caracteres com barra invertida tem uma particularidade: ela é substituída em uma etapa à parte que ocorre antes da etapa de leitura e execução do comando. Isso significa que ela é substituída mesmo quando aparece entre chaves, e o espaço resultante é tratado como um separador de palavra a menos que ele esteja entre chaves ou aspas.\\ - Barra invertida ("\").\ooo - Os caracteres (01234567) ooo (um, dois ou três deles) indicam o valor octal de oito bits do caractere Unicode que vai ser inserido. Os bits mais altos do caractere Unicode são 0.\xhh - Os caracteres (0123456789abcdefABCDEF) hh em hexadecimal indicam o valor hexadecimal de oito bits do caractere Unicode que vai ser inserido. O número de dígitos hexadecimais que podem ocorrer é infinito, mas todos eles são ignorados menos os dois últimos (o resultado é sempre um valor de um byte). O bit mais alto do caractere Unicode é 0.\uhhhh - Os caracteres hexadecimais hhhh (um, dois, três ou quatro deles) indicam o valor hexadecimal de dezesseis bits do caractere Unicode que vai ser inserido.A substituição de seqüências com barra invertida não ocorre em palavras expressas entre chaves a não ser a barra invertida seguida de quebra de linha, já explicada acima.[9] ComentáriosSe o primeiro caractere da primeira palavra de um comando for um "sustenido" (#), este sustenido e todos os caracteres seguintes até a próxima quebra de linha são considerados um comentário, logo são ignorados. O caractere de comentário só tem significado especial se estiver no início de um comando.[10] Ordem das substituiçõesCada caractere é processado exatamente uma vez pelo interpretador Tcl no processo de criação das palavras de um comando. Por exemplo, se houver substituição de variáveis, nenhuma outra substituição é feita no valor da variável após a substituição. Esse valor é inserido na palavra sem nenhuma outra modificação. Se houver alguma substituição de comando, os comandos dentro do comando são processados pela leitura em "efeito cascata" do interpretador Tcl. Nenhuma substituição é feita antes desse efeito cascata, e nenhuma outra substituição é feita no resultado do desdobramento do script.As substituições são feitas da esquerda para a direita, e nenhuma substituição é feita enquanto a substituição anterior não estiver terminada. Portanto, uma seqüência como...
set y [[set x 0]][[incr x]][[incr x]]... sempre fará com que a variável "y" tenha o valor "012".[11] Limites das substituições e das palavrasAs substituições não alteram os limites de cada palavra de um comando. Por exemplo: quando uma variável é substituída, todo o valor correspondente à variável pertence a uma única palavra mesmo que esse valor contenha espaços.