Hai l'opportunità di scrivere software per il Bracketeer™, un mainframe antico ma potente. Il software che ci gira sopra è scritto in un linguaggio proprietario. Gran parte della sua sintassi ti è familiare, ma noti moltissime parentesi quadre, graffe e tonde. Nonostante il Bracketeer™ sia potente, manca di flessibilità. Se il codice sorgente contiene parentesi quadre, graffe o tonde non bilanciate, il Bracketeer™ va in crash e deve essere riavviato. Per evitare questo scenario, inizi a scrivere codice in grado di verificare che parentesi quadre, graffe e tonde siano bilanciate prima di provare a eseguirlo sul Bracketeer™.
Data una stringa che contiene parentesi quadre ([]), parentesi graffe ({}), parentesi tonde (()) o qualsiasi loro combinazione, verifica che tutte le coppie siano abbinate e annidate correttamente.
Ogni altro carattere va ignorato.
Ad esempio, "{what is (42)}?" è bilanciata e "[text}" non lo è.
Tcl è un linguaggio molto semplice, ma il modo in cui l'interprete analizza il codice presenta un paio di casi limite insidiosi.
Le parentesi graffe in Tcl sono semplicemente un modo per quotare un blocco di testo: quel testo può essere interpretato come codice o come dati. All'interno delle parentesi graffe possono comparire parentesi graffe annidate, ma le parentesi graffe annidate devono essere bilanciate. Il manuale di Tcl dice questo:
Le parentesi graffe si annidano all'interno della parola: per ogni parentesi graffa aperta aggiuntiva deve esserci una parentesi graffa chiusa aggiuntiva (tuttavia, se una parentesi graffa aperta o chiusa all'interno della parola è quotata con un backslash, allora non viene contata nel trovare la parentesi graffa chiusa corrispondente).
La formulazione qui è piuttosto specifica: se vuoi avere un carattere di parentesi graffa aperta o chiusa non abbinata, deve essere quotato con un backslash. Quindi non fare così:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
Devi fare così
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
Questo può essere problematico per come Tcl analizza i commenti, che è diverso dalla maggior parte dei linguaggi. C'è un'ulteriore discussione sul wiki di Tcl.
Allo stesso modo, dato che Tcl usa le parentesi per la sostituzione dei comandi., anche all'interno delle stringhe racchiuse tra virgolette doppie devi fare attenzione a come effettuare l'escape delle parentesi quadre aperte.
Ad eccezione delle variabili di array associativo, le parentesi tonde sono semplicemente caratteri ordinari.
Iscriviti a Exercism per imparare e padroneggiare Tcl con 135 esercizi e il mentoring di persone reali, tutto gratis.