Tienes la oportunidad de escribir software para Bracketeer™, un mainframe antiguo pero potente. El software que se ejecuta en él está escrito en un lenguaje propietario. Gran parte de su sintaxis te resulta familiar, pero notas muchísimos corchetes, llaves y paréntesis. A pesar de que Bracketeer™ es potente, carece de flexibilidad. Si el código fuente tiene algún corchete, llave o paréntesis desbalanceado, Bracketeer™ se bloquea y hay que reiniciarlo. Para evitar ese escenario, empiezas a escribir código que pueda verificar que los corchetes, las llaves y los paréntesis están balanceados antes de intentar ejecutarlo en Bracketeer™.
Dado un string que contiene corchetes [], llaves {}, paréntesis () o cualquier combinación de estos, verifica que todos los pares estén emparejados y anidados correctamente.
Cualquier otro carácter debe ignorarse.
Por ejemplo, "{what is (42)}?" está balanceado y "[text}" no.
Tcl es un lenguaje muy sencillo, pero la forma en que el intérprete analiza el código tiene un par de casos límite bastante complicados.
Las llaves en Tcl son simplemente una manera de citar un bloque de texto: ese texto puede interpretarse como código o como datos. Dentro de las llaves pueden aparecer llaves anidadas, pero las llaves anidadas deben estar balanceadas. La página de manual de Tcl dice lo siguiente:
Las llaves se anidan dentro de la palabra: por cada llave de apertura adicional debe haber una llave de cierre adicional (sin embargo, si una llave de apertura o de cierre dentro de la palabra está escapada con una barra invertida, entonces no se cuenta al ubicar la llave de cierre correspondiente).
La redacción ahí es bastante específica: si quieres tener un carácter de llave de apertura o de cierre sin pareja, este debe estar escapado con una barra invertida. Así que no hagas esto:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
Debes hacer esto
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
Esto puede dar problemas por la forma en que Tcl analiza los comentarios, que es distinta de la de la mayoría de los lenguajes. Hay más discusión al respecto en la wiki de Tcl.
De manera similar, dado que Tcl usa los corchetes para la sustitución de comandos., incluso dentro de strings entre comillas dobles, debes tener cuidado al escapar los corchetes de apertura.
Con la excepción de las variables de array asociativo, los paréntesis son simplemente caracteres comunes.
Regístrate en Exercism para aprender y dominar Tcl con 135 ejercicios y mentoría humana real, todo gratis.