Il problema delle virgolette

By abell on 2009-04-01-13:54:24 | In sintassi

Per dirla tutta e subito, il problema delle virgolette, singole o doppie che siano, è che si rompono nell'annidamento. Facciamo un esempio (pseudo) letterario:

Continuò Don Chisciotte: "Al che, mia gentile Signora, il Gigante mi implorò con queste parole: "Per quello che hai di più caro, risparmia la mia vita e in cambio ti farò dono di un tesoro inimmaginabile.""

"E voi, che rispondeste?" chiese Dulcinea, incuriosita.

"Risposi: "Se davvero sei pentito del tuo agire, torna alle tue montagne e conduci una vita retta.""

E' chiaro quali delle virgolette aprono un discorso e quali lo chiudono, anche perché la punteggiatura dà indicazioni al riguardo. Ma chi volesse descrivere un modo oggettivo per capire come identificare le virgolette aperte e chiuse si troverebbe in qualche difficoltà. E per facilitare i lettori, spesso si usano simboli grafici differenti per indicare i vari livelli di citazione, ad esempio "..." per il primo livello, <<...>> per il secondo e così via. La frase di sopra può essere quindi scritta come:

Continuò Don Chisciotte: "Al che, mia gentile Signora, il Gigante mi implorò con queste parole: <<Per quello che hai di più caro, risparmia la mia vita e in cambio ti farò dono di un tesoro inimmaginabile.>>"

"E voi, che rispondeste?" chiese Dulcinea, incuriosita.

"Risposi: <<Se davvero sei pentito del tuo agire, torna alle tue montagne e conduci una vita retta.>>"

Raramente in un testo letterario i livelli sono più di due, rarissimamente più di tre. In altri ambiti, però, la nidificazione viene usata sistematicamente per un numero di livelli non determinabile a priori. Ad esempio, l'espressione di pi greco come frazione continua inizia così
3 + ( 1 / ( 7 + 1 / ( 15 + 1 / ( 1 + 1 / ( ... ) ) ) ) )
(e non finisce mai, perché pi greco non è esprimibile come frazione).

Se si usano le parentesi come nell'esempio precedente, o una qualsiasi coppia di simboli differenti, esistono modi semplici per determinare i raggruppamenti ed una sola coppia basta per qualsiasi livello di nidificazione. Ad una conferenza, di cui a dire il vero capii ben poco, ricordo Gerd Faltings che tra il ridacchiare degli spettatori controllava la giusta chiusura delle parentesi contando ad alta voce secondo un ordine che, adattato all'espressione precedente, sarebbe:

3 + ( [uno] 1 / ( [due] 7 + 1 / ( [tre] 15 + 1 / ( [quattro] 1 + 1 / ( [cinque] ... ) [quattro] ) [tre] ) [due] ) [uno] ) [zero]
E arriviamo all'ambito della programmazione. Se invoco una funzione
send ( msg )
e so che msg può essere ottenuto come risultato di composeMsg ( sender, body ), l'invocazione di sopra può essere sostituita da
send ( composeMsg ( sender, body ) )
Questa sostituzione è valida sempre e comunque, a prescindere dal contesto di send ( msg ) Con le virgolette, non è così facile. Facciamo un esempio in bash. Dato un comando, come ad esempio
ls -l
è possibile eseguirlo su una macchina remota con ssh, così:
ssh user@remote.machine "ls -l"
Il problema si presenta subito, in tutta la sua evidenza, se il comando da eseguire contiene a sua volta delle virgolette, come l'innocente
echo "< BENVENUTI > su developer.it"
Infatti, sostuituendo il nuovo comando al vecchio, otteniamo
ssh user@remote.machine "echo "< BENVENUTI > su developer.it""
e tutto si rompe, visto che le virgolette dopo echo chiudono le prime e il segno < esce dal contesto stringa e viene interpretato come redirezionamento da bash.