Lehetőséget kapsz, hogy szoftvert írj a Bracketeer™-hez, egy ősi, de nagy teljesítményű nagyszámítógéphez. A rajta futó szoftver egy saját fejlesztésű nyelven íródott. A szintaxisának nagy része ismerős, de feltűnik, hogy rengeteg szögletes zárójel, kapcsos zárójel és kerek zárójel van benne. Bár a Bracketeer™ nagy teljesítményű, rugalmasnak egyáltalán nem mondható. Ha a forráskódban akár egyetlen kiegyensúlyozatlan szögletes zárójel, kapcsos zárójel vagy kerek zárójel is akad, a Bracketeer™ összeomlik, és újra kell indítani. Hogy elkerüld ezt a helyzetet, olyan kódot kezdesz írni, amely ellenőrzi, hogy a szögletes zárójelek, a kapcsos zárójelek és a kerek zárójelek kiegyensúlyozottak-e, mielőtt megpróbálnád futtatni a Bracketeer™-en.
Adott egy string, amely szögletes zárójeleket ([]), kapcsos zárójeleket ({}), kerek zárójeleket (()) vagy ezek bármilyen kombinációját tartalmazza: ellenőrizd, hogy minden pár illeszkedik-e és helyesen egymásba ágyazódik-e.
Minden más karaktert hagyj figyelmen kívül.
Például a "{what is (42)}?" kiegyensúlyozott, a "[text}" viszont nem.
A Tcl egy nagyon egyszerű nyelv, de abban, ahogy az értelmező a kódot feldolgozza, van néhány kellemetlen határeset.
A kapcsos zárójelek a Tcl-ben egyszerűen egy szövegblokk idézésére szolgálnak. Az ilyen szöveg kódként vagy adatként is értelmezhető. A kapcsos zárójelek között egymásba ágyazott zárójelek is megjelenhetnek, de ezeknek kiegyensúlyozottnak kell lenniük. A Tcl man oldala ezt írja:
A kapcsos zárójelek egymásba ágyazódnak a szón belül: minden további nyitó kapcsos zárójelhez kell egy további csukó kapcsos zárójel (ha azonban a szón belüli nyitó vagy csukó kapcsos zárójel backslash karakterrel van idézve, akkor nem számít bele a hozzá tartozó csukó zárójel megkeresésébe).
A megfogalmazás ott meglehetősen pontos: ha nem párosított nyitó vagy csukó kapcsos zárójel karaktert szeretnél, akkor azt backslash karakterrel kell idézned. Tehát ne ezt csináld:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
Ezt viszont igen:
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
Ez problémát okozhat amiatt, hogy a Tcl másképp dolgozza fel a megjegyzéseket, mint a legtöbb nyelv. Erről bővebben a Tcl wikin olvashatsz.
Hasonlóképpen, mivel a Tcl a szögletes zárójeleket a parancsbehelyettesítéshez. használja, még a dupla idézőjelbe tett szövegekben is figyelned kell a nyitó szögletes zárójelek escape-elésére.
Az asszociatív tömbváltozóktól eltekintve a kerek zárójelek egyszerűen közönséges karakterek.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Tcl nyelvet 135 feladat segítségével, valódi emberi mentorálással, mindez ingyen.