提问于:
浏览数:
1875
如下代码尝试测试在私有函数`\__debug_analysis:N`中定义的局部私有变量(常量)`\l__debug_tl`的作用域,结果发现在一次循环(`map`映射)完成后,局部变量仍存在定义。
如下代码共报错2次`\l_@@_tl`已定义。
要如何实现真正意义上的**局部**呢?
```tex
\documentclass{ctexbook}
\makeatletter
\ExplSyntaxOn
\begin{document}
%<@@=debug>
\cs_new:Npn \@@_analysis:N #1 {
\tl_const:Nn \l_@@_tl {#1} %测试局部定义的变量
\l_@@_tl %直接输出
}
\seq_set_from_clist:Nn \l_@@_seq {我,爱,你}
\seq_map_function:NN \l_@@_seq \@@_analysis:N %测试map函数的映射方式
\end{document}
\ExplSyntaxOff
\makeatother
```
此问题主要矛盾是必须要在函数内定义其他变量或函数,从而形成类似于函数闭包的结构,以实现更为复杂的算法功能。如下先定义再赋值的解决方案可以不用给出
```tex
%<@@=debug>
\tl_new:N \l_@@_tl %在外面定义
\cs_new:Npn \@@_analysis:N #1 {
\tl_set:Nn \l_@@_tl {#1} %在里面赋值
\l_@@_tl%直接输出
}
\seq_set_from_clist:Nn \l_@@_seq {我,爱,你}
\seq_map_function:NN \l_@@_seq \@@_analysis:N%测试map函数的映射方式
```
1 回答
0
tex 没有闭包,你看到的主要都是宏 [1]。所以,不存在你写的注释 `%在里面赋值` 的效果。除了手动取消定义,还可以用分组 + 局部定义的办法来模拟闭包。注意只是模拟。
[1] 详细可参考 `texdoc topic`。`texdoc tex-nutshell` 里有个总结。
```tex
\documentclass{article}
\begin{document}
\def\x{abc}
\ExplSyntaxOn
\makeatletter
\cs_new:Npn \@@_analysis:N #1
{
\group_begin:
\tl_set:Nn \l_@@_tl {#1}
\l_@@_tl
\group_end:
}
\@@_analysis:N \x % print "abc"
\par
\meaning\l_@@_tl % print "undefined"
\makeatother
\ExplSyntaxOff
\end{document}
```
PS:`\end{document}` 后的内容会被忽略,所以不要在它后面输入有意义的内容。
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。