Ho quasi capito tutto il tuo procedimento, devo ancora trovare il coraggio di iniziare a pensare al perché dei 7 \expandafter di fila… ma ci arriverò!
Francesco, ti confesso, io ho cominciato con soli tre \expandafter e io stesso ho scoperto sperimentalmente che ce ne volevano 7; la spiegazione sta in questo; prima di far intervenire \ifbpoem bisogna che il versetto sia completamente sviluppato e quindi che sia completamente sviluppato \@nameuse{\the\versetto};
Per sviluppare questo comando ci vogliono tre sviluppi (supponendo che il contatore \versetto contenga il numero 12 e il suo contenuto sia la lista di token che io indico con
[tt]\@nameuse{\the\versetto} –> \csname \the\versetto\endcsname –> \12 –>
dunque bisogna ritardare l’esecuzione di \ifbpoem tre volte mediante gli \expandafter; dei 7 \expandafter la prima volta vengono sfruttati quelli di posto dispari (in tutto quattro) per avere il primo sviluppo di [tt]\@nameuse{\the\versetto}[/tt]; restano 3 \expandafter e al secondo giro vengono usati quelli di posto dispari (in totale 2) per sviluppare [tt]\csname…\encsname[/tt]; ne resta 1; questa volta serve l’unico \expanfdafter di posto dispari per sviluppare [/tt]\12[/tt] e rimanere coi token da sviluppare rimanenti:
[tt]\ifbpoem
A questo punto non c’è più nessun \expandafter che possa ritardare l’esecuzione di \ifbpoem e questo, mediante \futurelet, può esaminare il primo token della lista
Bisogna sapere quante espansioni bisogna eseguire prima di far entrare in gioco il comando da eseguire; nel nostro caso erano 3, e dovendo aggiungere sempre tanti \expandafter di posto dispari quanti ne occorrono, ne abbiamo 1+2+4=7. Se avessimo avuto bisogno di 4 espansioni ne sarebbero occorsi 1+2+4+8=15 😯
Mi pare di avere letto da qualche parte una intervista al nostro IGW (Italian Grand Wizard) Enrico, dove diceva, se ben ricordo, che egli una volta aveva dovuto ricorrere a 15 \expandafter; conoscendo il meccanismo ora sappiamo perché 😉
Ciao
Claudio