Você tem a oportunidade de escrever software para o Bracketeer™, um mainframe antigo, mas poderoso. O software que roda nele é escrito em uma linguagem proprietária. Grande parte da sintaxe é familiar, mas você percebe muitos colchetes, chaves e parênteses. Apesar de o Bracketeer™ ser poderoso, ele não tem flexibilidade. Se o código-fonte tiver qualquer colchete, chave ou parêntese desbalanceado, o Bracketeer™ trava e precisa ser reiniciado. Para evitar esse cenário, você começa a escrever um código capaz de verificar se colchetes, chaves e parênteses estão balanceados antes de tentar rodá-lo no Bracketeer™.
Dada uma string que contém colchetes [], chaves {}, parênteses () ou qualquer combinação deles, verifique se todos os pares estão corretamente pareados e aninhados.
Quaisquer outros caracteres devem ser ignorados.
Por exemplo, "{what is (42)}?" está balanceada e "[text}" não está.
O Tcl é uma linguagem muito simples, mas a forma como o intérprete analisa o código tem alguns casos extremos desagradáveis.
No Tcl, as chaves são simplesmente uma forma de delimitar um bloco de texto; esse texto pode ser interpretado como código ou como dados. Dentro das chaves, podem aparecer chaves aninhadas, mas as chaves aninhadas precisam estar balanceadas. A página de manual do Tcl diz o seguinte:
As chaves se aninham dentro da palavra: para cada chave de abertura adicional deve haver uma chave de fechamento adicional (no entanto, se uma chave de abertura ou de fechamento dentro da palavra estiver escapada com uma barra invertida, ela não é contada na localização da chave de fechamento correspondente).
O texto ali é bem específico: se você quiser ter um caractere de chave de abertura ou de fechamento sem par, ele precisa ser escapado com uma barra invertida. Então não faça isto:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
Você precisa fazer isto
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
Isso pode ser problemático por causa da forma como o Tcl analisa comentários, que é diferente da maioria das linguagens. Há mais discussão na wiki do Tcl.
Da mesma forma, como o Tcl usa colchetes para substituição de comandos, mesmo dentro de strings entre aspas duplas, você precisa tomar cuidado ao escapar colchetes de abertura.
Com exceção das variáveis de array associativo, os parênteses são simplesmente caracteres comuns.
Crie sua conta no Exercism para aprender e dominar Tcl com 135 exercícios e mentoria humana de verdade, tudo de graça.