- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 13 anni, 10 mesi fa da .
-
Topic
-
E me ne scuso sin da ora, ma se non riesco a risolverlo credo di non riuscire ad andare avanti.Tra i `Dirty tricks’ Knuth offre la seguente soluzione per stabilire se una certa lista di tokens [tt]\t[/tt] contiene almeno un asterisco (*12)
`\newif\ifresult
\def\atest#1{\expandafter\a\the#1*\atest\a}
\long\def\a#1*#2#3\a{\ifx\atest#2\resultfalse\else\resulttrue\fi}`
Per cercare di capire pongo [tt]\t={b?>*m2}[/tt] , ovvero una lista di tokens tra cui c’è un asterisco.
L’espansione di [tt]\atest[/tt] diventa
`\a b?>*m2*\atest\a`
Tale lista di tokens, nell’espansione di [tt]\a[/tt], si distribuisce così:
`#1 -> b?>
delimitatore -> *
#2 -> m2*
#3 -> \atest
delimitatore -> \a`
A questo punto [tt]\a[/tt] ci dice che se l’espansione di [tt]\atest[/tt] è uguale a [tt]m2*[/tt] , [tt]\t[/tt] non contiene alcun asterisco, altrimenti si.
Ma noi sappiamo che [tt]\t[/tt] contiene l’asterisco, quindi l’espansione di [tt]\atest[/tt] deve essere diversa da [tt]m2*[/tt] .
Qui purtroppo mi perdo. Nel giro di chiamate ricorsive non riesco a capire cosa può o non può contenere il test [tt]\ifx[/tt] dell’ultima macro, e quando il risultato è positivo o negativo.Qual’è il modo per venirne a capo?
Grazie, ciao.
- Devi essere connesso per rispondere a questo topic.