如下代码尝试测试在私有函数`\__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 回答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}` 后的内容会被忽略,所以不要在它后面输入有意义的内容。

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。