Re: una facciata sola

#22214
Up
0
Down
::

Scusa,

forse risulterò patetico o tardone, ma non ho capito se l’espansione tra \csname e \endcsname la fa \csname stesso o \expandafter che sta prima di \let o \endcsname.

In quetso caso Il comando “espandi dopo” (presente prima di \endcsname precedente) espande ps@empty o, come credo io, tutto l’insieme
`
\csname ps@empty\endcsname`
?

Non è roba facile, lo so.

\csname \endcsname espande completamente la lista all’interno. È \csname che provoca l’espansione, la lista finisce quando si incontra il comando \endcsname corrispondente (non è vietato avere \csname annidati).

Adesso vediamo che cosa succede con
`\csname pippo\expandafter\endcsname\csname pluto\endcsname`
Il primo \csname provoca l’espansione della lista, come detto; quando si arriva a \expandafter questo espande il token successivo al seguente, in questo caso \csname. Ma \expandafter non provoca espansione completa, solo al primo livello; quindi a questo punto la lista che si ha è equivalente a
`\pippo\pluto`
e TeX riparte espandendo \pippo.

Un esempio più complicato:
`\def\aaa{xyz}
\csname pippo\aaa\expandafter\endcsname\csname\aaa\endcsname`
Espansione della prima lista: pippo\aaa\expandafter -> pippoxyx + espansione del csname seguente in \xyz

TeX esegue l’espansione completa quando incontra \edef e \csname; in altri casi esegue solo l’espansione di primo livello
`\def\aaa{xy\z}
\def\z{pippo}
\edef\prova{\aaa p}`
La macro \prova ha come testo di sostituzione xypippop, perché l’espansione è completa.
`\def\aaa{xy\z}
\def\z{pippo}
\expandafter\def\expandafter\prova\expandafter{\aaa p}`
Adesso \prova ha come testo di sostituzione xy\z p, perché \expandafter esegue solo l’espansione di primo livello \aaa -> xy\z (i tre \expandafter servono per arrivare proprio a \aaa).

Ciao
Enrico

Go to top