Warum erlaubt TeX keine lokalen, erweiterbaren Definitionen innerhalb von Befehlen?

Warum erlaubt TeX keine lokalen, erweiterbaren Definitionen innerhalb von Befehlen?

Die Hälfte der Qualen beim Programmieren von TeX ist der Unterschied zwischen erweiterbaren und nicht erweiterbaren Befehlen, wobei letztere normalerweise das Ergebnis einer Zuweisung innerhalb der Befehlsdefinition sind. Das lässt mich fragen, warum weder Knuths TeX noch spätere TeX-Engines eine Konstruktion \local\def(oder mit einem anderen Namen) hinzufügen, die dieses Problem ein für alle Mal löst? Dann könnten Sie

\def\mycmd{%
    \local\def\tempa{<something>}%
    \local\def\tempb{<something>}%
    \local\def\tempc##1##2{<something>}%
    \tempc{\tempa}{\tempb}%
}

und trotzdem einen erweiterbaren Befehl haben. (Ich weiß, dass Sie eine Konstruktion wie verwenden können, \group_begin: ... \tl_set:Nn \l__gaussler_temp_tl { ... } \exp_args:NV \group_end: \l__gaussler_temp_tlum einen Workaround zu finden, aber dieser wird nicht erweiterbar sein). Mit anderen Worten würde es genau wie eine Funktion in einer moderneren Programmiersprache funktionieren. Die Verwendung \localaußerhalb einer Befehlsdefinition könnte einen Fehler ergeben. Dies würde viele der Kopfschmerzen bei der TeX-Programmierung lösen.

Warum wurde dies noch nicht getan?

Antwort1

luatex hat, was Sie (vielleicht) suchen

\documentclass{article}

\begin{document}

{
\edef\zz{ ab \immediateassignment\def\zzz{this} cd \zzz}

zz: [\zz]

zzz: [\zzz]

\meaning\zzz
}

\meaning\zzz


\end{document}

Hier \immediateassignment\def\zzzist eine erweiterbare Zuweisung von , die daher in der Einbeziehung mit dem definierten Befehl innerhalb desselben \zzzzulässig ist . Es handelt sich um eine lokale Zuweisung, aber lokal für die aktuelle Gruppe, nicht für die aktuelle . Es ist nicht klar, ob Sie das gemeint haben.\edef\edef\edef

„so“ \zzzwird in verwendet \edefund ist auch nach dem definiert, \edefverlässt aber den Gültigkeitsbereich bei dem, }das die aktuelle Gruppe beendet, und wird deshalb \meaningin der letzten Zeile wieder als undefiniert angezeigt.

Bildbeschreibung hier eingeben

verwandte Informationen