Re: Appunti di programmazione in LaTeX e TeX – chiarimenti

#71518
Up
0
Down
::

DirkPitt” post=70678Ciao,

vorrei chiedere chiarimenti sulla guida in oggetto. Per questioni di brevità mi rivolgo a chi può rispondermi avendo la pazienza di aprire la guida mentre legge questo post.

Ho (per il momento 🙂 ) due domande:

1) A pag. 62 – “Una macro ricorsiva” – la seconda condizione mi pare essere mirata a verificare la positività del numero da trasformare nella base che è passata come primo parametro; lo suppongo in base al fatto che la prima condizione si riferisce a #1 e il messaggio d’errore alla base, quindi deduco che #2 è il numero da trasformare. Però il messaggio di errore (secondo if) recita “La base deve essere un numero positivo”: cosa non ho capito?

2) Alla fine della sezione (pag. 63) si fa la seguente considerazione
`
È decisiva l’apertura del gruppo supplementare nel quale eseguire le assegnazioni:
gli stessi contatori vengono usati contemporaneamente più volte, ma sempre in un
gruppo diverso e i valori corretti vengono reimpostati al momento giusto.
`
Questo significa che i gruppi possono essere pensati (in questo specifico caso) come gli stack dei record di attivazione (con riferimento alle chiamate a function in altri linguaggi) in cui i contatori sono allocati sullo stack (e non nell’heap – sempre riferendosi ad altri linguaggi) per cui i valori sono indipendenti fra le varie chiamate?

Grazie, ciao!

1) In quelle macro ci sono alcuni errori che devo correggere.

2) Qui la faccenda è troppo tecnica per me. 🙂 In effetti TeX mantiene, per ogni gruppo che apre, uno stack nel quale registra le assegnazioni locali per poterle poi disfare alla fine del gruppo. Questo semplice file da compilare con pdftex ti mostra il meccanismo in azione:

`\tracingrestores=1
\tracinggroups=1
\tracingassigns=1

\count255=4

{\count255=2 \advance\count255 by 1 }

{\count255=9 \global\count255=42 }

\bye`
Il file .log dice
`{changing \count255=92}
{into \count255=4}
{entering simple group (level 1) at line 8}
{changing \count255=4}
{into \count255=2}
{changing \count255=2}
{into \count255=3}
{restoring \count255=4}
{leaving simple group (level 1) entered at line 8}
{entering simple group (level 1) at line 10}
{changing \count255=4}
{into \count255=9}
{globally changing \count255=9}
{into \count255=42}
{retaining \count255=42}
{leaving simple group (level 1) entered at line 10}`
Il valore iniziale è 92 perché \count255 è usato come registro temporaneo. Con l’ultima assegnazione vedi che non c’è il “restore” perché è globale.

Uno dei problemi che possono capitare è che lo stack si esaurisca perché lo stesso registro è usato sia localmente sia globalmente (come nell’esempio) e quindi alcune posizioni di memoria non vengono liberate. Da qualche parte negli Appunti trovi l’accenno alla faccenda: una delle raccomandazioni che si fanno sempre è che le assegnazioni dello stesso oggetto siano sempre locali o sempre globali. Non solo ai registri: anche [tt]\def[/tt] e [tt]\let[/tt] (e qualsiasi altro modo di dare significato a un token simbolico) sono assegnazioni.

Ciao
Enrico

Go to top