A dirty problem [lungo e complesso]

  • Creatore
    Topic
  • #80108
    Up
    0
    Down
    ::


    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.

Visualizzazione 0 filoni di risposte
  • Autore
    Risposte
    • #80109
      Up
      0
      Down
      ::


      Alla fine ci sono arrivato da solo.

      Se [tt]\t[/tt] non contiene alcun asterisco il terzo parametro di [tt]\a[/tt] è vuoto, il secondo è [tt]\atest[/tt] e il test diventa
      `\ifx\atest\atest\resultfalse\else\resulttrue\fi`
      che ovviamente rstituisce [tt]\resultfalse[/tt], e non conta che [tt]\ifx[/tt] esegue un livello di espansione.

      Se invece [tt]\t[/tt] contiene almeno un asterisco il primo di questi diventa il delimitatore di [tt]\a[/tt], il cui terzo parametro diventa [tt]\atest[/tt] e il cui secondo parametro è costituito dai tokens successivi al primo asterisco in [tt]\t[/tt]; il test di [tt]\a[/tt] restituisce quindi \resulttrue.

      Ciao.

Visualizzazione 0 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top