Tienes la oportunidad de escribir software para el 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 te das cuenta de que hay muchísimos corchetes, llaves y paréntesis. A pesar de que el Bracketeer™ es potente, carece de flexibilidad. Si el código fuente tiene algún corchete, llave o paréntesis desequilibrado, el Bracketeer™ se bloquea y hay que reiniciarlo. Para evitar ese escenario, empiezas a escribir código que pueda comprobar que los corchetes, las llaves y los paréntesis están equilibrados antes de intentar ejecutarlo en el Bracketeer™.
Dado un string que contiene corchetes ([]), llaves ({}), paréntesis (()) o cualquier combinación de ellos, comprueba que todos los pares estén emparejados y anidados correctamente.
Cualquier otro carácter debe ignorarse.
Por ejemplo, "{what is (42)}?" está equilibrado 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 complicados.
Las llaves en Tcl son simplemente una forma de entrecomillar 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 (no obstante, si una llave de apertura o de cierre dentro de la palabra está entrecomillada con una barra invertida, no se cuenta a la hora de localizar la llave de cierre correspondiente).
La redacción es bastante concreta: si quieres tener un carácter de llave de apertura o de cierre sin su pareja, debe ir entrecomillado 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 ser problemático por la forma en que Tcl analiza los comentarios, que es distinta de la de la mayoría de los lenguajes. Hay más información al respecto en la wiki de Tcl.
Del mismo modo, dado que Tcl usa los corchetes para la sustitución de comandos, incluso dentro de cadenas entrecomilladas con comillas dobles, hay que tener cuidado al escapar los corchetes de apertura.
Salvo en el caso de las variables de array asociativo, los paréntesis son simplemente caracteres normales.
Regístrate en Exercism para aprender y dominar Tcl con 135 ejercicios y mentoría humana real, todo gratis.