在宏或环境中本地声明变量是一种不好的做法吗?

在宏或环境中本地声明变量是一种不好的做法吗?

对我来说,全局声明变量会使项目变得混乱。尤其是当需要声明许多变量时。

此外,在本地声明变量将节省我们的时间,因为我们不需要确保变量是否已声明。

我不知道这在 TeX 中是否是一种不好的做法。

\documentclass{minimal}

\newcommand\Average[5]{%
\newcount\Total%
\Total\numexpr#1+#2+#3+#4+#5\relax%
\number\numexpr\Total/5\relax%
}

\begin{document}
The average of 1, 2, 3, 4, 5 is \Average{1}{2}{3}{4}{5}.
\end{document}

答案1

我已经在我的博客,但为了回答这个问题,我会做一些编辑并在这里发布要点。

一、标准\newcount,,\newtoksETC函数全局分配。因此

\begingroup  
  \newcount\mycount
\endgroup

会永久占用寄存器,即使\mycount在组结束时消失。埃泰克斯套餐提供\loccount,,\loctoksETC.,这确实释放了组末尾的分配。所以

\begingroup  
  \loccount\mycount
\endgroup

至少不会消耗寄存器。但是,还存在其他问题。

在大多数语言中,局部变量是某个函数的局部变量,而嵌套函数有自己独立的局部变量。在 TeX 中,情况有所不同,因为它是一种宏语言,只有分组才能使事物成为局部变量。因此,类似这样的代码

\def\BadIdea{%
  \loccount\mycount
  ...
}

不会破坏\mycount插入的材料的末尾\BadIdea。另一方面,事物将在组内起作用,因此这样做

\def\BetterIdea{%
  \begingroup
    \loccount\mycount
    ....
  \endgroup
}

将按预期销毁\mycount。但是,通过执行以下操作可以获得大致相同的效果

\newcount\mycount
\def\BetterIdea{%
  \begingroup
    ....
  \endgroup
}

甚至(如果你知道它是安全的)

\def\BetterIdea{%
  \begingroup
    \@tempcnta=<value>
    ....
  \endgroup
}

IE使用通用临时寄存器。

由于 TeX 的局部变量与组有关,而不是与宏有关,我认为最佳做法仍然是全局分配并在本地使用。戴上我的 LaTeX3“帽子”,我要指出的是,我们确实尝试了一些本地分配,当我们解决问题时,我们发现这有点像一场噩梦。

相关内容