TeX では、コマンド内でローカルで拡張可能な定義が許可されないのはなぜですか?

TeX では、コマンド内でローカルで拡張可能な定義が許可されないのはなぜですか?

TeXプログラミングの苦労の半分は、展開可能なコマンドと展開不可能なコマンドの違いです。後者は通常、コマンド定義内で行われる割り当ての結果です。それで、なぜKnuthの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_tl拡張可能なコマンドも残っています。(回避策として go のような構文を使用できることは知っていますが、拡張可能ではありません)。言い換えれば、より現代的なプログラミング言語の関数と同じように動作します。\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、 の拡張可能な割り当てを示します。これは、同じ 内で defined コマンドを使用することを含めて\zzz、 で許可されます。これはローカル割り当てですが、現在の ではなく、現在のグループに対してローカルです。これが意図したものかどうかは不明です。\edef\edef\edef

\zzzで使用され\edef、 の後にも定義されていますが、現在のグループを終了する\edefでスコープ外になるため、最終行で再び未定義として表示されます。}\meaning

ここに画像の説明を入力してください

関連情報