/ / Różnica między zagnieżdżonym {} i [] - tcl

Różnica między zagnieżdżonymi {} i [] - tcl

Dlaczego wewnątrz cytatu z klamrą musisz uciec wszystko nawiasy klamrowe (które nie powinny się liczyć w zagnieżdżaniu), ale wewnątrz podstawienia nawiasów nie musisz uciekać ze wszystkich nawiasów (które nie powinny się liczyć w zagnieżdżaniu).

puts "}" ;# ok in top-level (1)
if {1} {puts "}"} ;# but not ok when inside a brace quote (2)

puts {]} ;# ok in top-level (3)
set output [puts {]}] ;# and still ok inside a bracket substitution (4)

Odpowiedzi:

4 dla odpowiedzi № 1

Kiedy pojawia się tłumacz { na początku słowa szuka dopasowania } aby uzyskać słowo (nazwa polecenia do wykonania lub jeden z argumentów do wysłania do polecenia).

Ale kiedy interpreter napotyka unescaped [, nie szuka dopasowania ]. Zatrzymuje parsowanie samego skryptu i cyklicznie wywołuje inny interpreter. Ten tłumacz zaczyna analizować postać podążającą za [. Kiedy znajdzie { w przykładzie 4 rozpoczyna tryb cytowania, więc ] jest traktowany jak normalna postać.

Dlaczego więc nie wywołać rekurencyjnie tłumacza, kiedy { spotyka się też i pozbyć sięproblem brace w przykładzie 2? Ponieważ słowo, które cytujesz za pomocą nawiasów klamrowych, nie zawsze jest skryptem, a nawet jeśli jest, prawdopodobnie nie powinno być uruchamiane od razu. Cytowanie nawiasów musi być dokładne; parser może traktować znaki inaczej jeśli są w środku ", [] etc ... lub nie, tak jak parser skryptów.