Почему TeX не допускает локальных расширяемых определений внутри команд?

Почему TeX не допускает локальных расширяемых определений внутри команд?

Половина боли программирования TeX — это разница между расширяемыми и нерасширяемыми командами, причем последнее обычно является результатом назначения, происходящего внутри определения команды. Это заставляет меня задуматься, почему ни TeX Кнута, ни более поздние движки TeX не добавляют конструкцию \local\def(или с каким-то другим названием), которая решает эту проблему раз и навсегда? Тогда вы могли бы сделать

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

и все еще иметь расширяемую команду. (Я знаю, что вы можете использовать конструкцию типа \group_begin: ... \tl_set:Nn \l__gaussler_temp_tl { ... } \exp_args:NV \group_end: \l__gaussler_temp_tlgo, чтобы получить обходной путь, но она не будет расширяемой). Другими словами, она будет работать так же, как функция в более современном языке программирования. Использование \localвне определения команды может привести к ошибке. Это решило бы большую часть головной боли программирования TeX.

Почему этого до сих пор не сделано?

решение1

у luatex есть то, что вы (возможно) просите

\documentclass{article}

\begin{document}

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

zz: [\zz]

zzz: [\zzz]

\meaning\zzz
}

\meaning\zzz


\end{document}

Вот \immediateassignment\def\zzzрасширяемое назначение, \zzzкоторое, следовательно, разрешено в \edefвключительном использовании определенной команды в пределах того же \edef. Это локальное назначение, но локальное для текущей группы, а не для текущего \edef. Неясно, это ли вы имели в виду.

so \zzzиспользуется в \edefи также определен после , \edefно выходит из области действия в , }который завершает текущую группу, поэтому \meaningснова отображается как неопределенный в последней строке.

введите описание изображения здесь

Связанный контент