[Luciano ES] provides, on July 28 2003, his version of the [Endekalogue], in Brazilian Portuguese. ---- As seguintes regras estabelecem a sintaxe e a semântica da linguagem Tcl: '''[[1]] Comandos''' Um ''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, 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. '''[[2]] Execução''' Comandos 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 para o procedimento de comando. O procedimento de 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]] Palavras''' As palavras de um comando são separadas por um espaço (exceto o espaço entre uma linha e outra, que é considerado um separador de comandos). '''[[4]] Aspas duplas''' Se o primeiro caractere de uma palavra for as aspas duplas ('''"'''), o fim da palavra é demarcado pelo próximo caractere de aspas duplas. Se um ponto-e-vírgula, segundo colchete de um par de colchetes ou espaço (incluindo quebra de linha) estiverem entre as aspas, esses caracteres são tratados como caracteres comuns, que fazem 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]] Chaves''' Se o primeiro caractere de uma palavra for a chave que abre ("'''{'''"), o fim da palavra é demarcado pela chave que fecha ("'''}'''"). Se houver chaves que abrem dentro de um par de chaves, para cada nova chave que abre, deve haver uma chave que fecha. Mas se qualquer chave (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 ou 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 comandos''' Se 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 fim é sinalizado 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 de seu último comando) dentro da palavra. O número de substituições de comando que podem ocorrer em cada palavra é ilimitado. A substituição de comando não se aplica a palavras expressas entre chaves. '''[[7]] Substituição de variáveis''' Se 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, sublinhados (''_'') ou separadores de ''namespace'' (o símbolo de dois pontos expressos duas ou mais vezes seguidas). $nome(índice) "Nome" é o nome de uma variável ''array'', e "índice" indica o nome de um elemento dentro da ''array''. "Nome" deve conter somente letras, dígitos, sublinhados (''_'') 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 invertida''' A 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, incluído na 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) (0x7). '''\b''' Retrocesso (Backspace) (0x8). '''\f''' Avanço de formulário (0xc). '''\n''' Quebra de linha (0xa). '''\r''' Retorno de carro (0xd). '''\t''' Tabulação (0x9). '''\v''' Tabulação vertical (0xb). '''\''' - 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 dígitos ''ooo'' (um, dois ou três deles) indicam o valor octal de oito bits do caractere Unicode que vai ser inserido. O bits mais altos do caractere Unicode são 0. '''\x'''hh - Os dígitos ''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 bits mais altos do caractere Unicode são 0. '''\u'''hhhh - Os dígitos 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ários''' Se 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, i. e. são ignorados. O caractere de comentário só tem significado especial se estiver no início de um comando. '''[[10]] Ordem das substituições''' Cada 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 palavras''' As 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.