提问于:
浏览数:
2249
相同数据经压栈弹栈后数据被“修改”,如何让判断变回正确
```tex
\documentclass{ctexbook}
\begin{document}
\makeatletter
\ExplSyntaxOn
% <@@=debug>
\tl_const:Nn \l_@@_a_tl {000}
\seq_new:N \g_@@_b_tl
\tl_new:N \l_@@_c_tl
\seq_push:Nn \g_@@_b_tl {\l_@@_a_tl}
\seq_pop:NN \g_@@_b_tl \l_@@_c_tl
\tl_if_eq:nnTF {\l_@@_a_tl} {\l_@@_c_tl} {True} {False}
|\l_@@_a_tl|\l_@@_c_tl|
\ExplSyntaxOff
\makeatother
\end{document}
```
输出情况如下图
![](https://pics.latexstudio.net/data/images/202004/afb4deef8436691.png)
2 回答
0
`\l_@@_a_tl` 和 `\l_@@_c_tl` 的定义不同,所以输出 false。
- `\l_@@_a_tl` 的定义是 `000`
- 进栈出栈的一直是 token list `\l_@@_a_tl`,而不是它的值
- 所以 `\l_@@_c_tl` 的定义是 `\l_@@_a_tl`
如何查看 token list 的定义?
- 往 PDF 输出:用 `\token_to_meaning:N \l_@@_a_tl`(对应 primitive `\meaning`)
- 往 stdout 输出:用 `\tl_show:N \l_@@_a_tl`
怎么解决提问里的问题?
- 先展开、后入栈,把 token list 的值压进去,而非 token list 本身:`\seq_push:NV \l_@@_a_tl`
- 或者,在比较时作展开。这里同样使用 `V` 进行取值
```tex
\cs_generate_variant:Nn \tl_if_eq:nnTF {nV}
\tl_if_eq:nVTF {\l_@@_a_tl} {\l_@@_c_tl} {true} {false}
```
- 以上两种方法是「或」的关系,且不能同时使用。
同时使用时,入栈的是 `000`,进行比较的是 `\l_@@_a_tl` 和 `1000`,这样依然输出 false。
PS:
- `% <@@=debug>` 只在 dtx 文件内有效,写在 tex 文件里是没有用的,只会当作普通的注释。
- TeX 的求值模型更接近 normal-order evaluation,参见 [SICP, sec. 1.1.5](http://sarabander.github.io/sicp/html/1_002e1.xhtml#g_t1_002e1)
-
回复 undefined :调整了回答,强调了 "exclusive or" 的关系 – 论坛 github.com/CTeX 2020-04-17 01:06 回复
-
非常感谢! – zhaochongbin 2020-04-16 23:12 回复
-
噢我懂了!! – zhaochongbin 2020-04-16 23:11 回复
-
奇怪了,根据您上面的改动,输出仍是false。改动后的代码我贴在下面的楼里了。 – zhaochongbin 2020-04-16 22:47 回复
0
一次修改
```tex
\documentclass{ctexbook}
\begin{document}
\ExplSyntaxOn
\tl_const:Nn \l_a_tl {000}
\seq_new:N \g_b_tl
\tl_new:N \l_c_tl
%改动1
\seq_push:NV \g_b_tl {\l_a_tl}
\seq_pop:NN \g_b_tl \l_c_tl
%改动2
\cs_generate_variant:Nn \tl_if_eq:nnTF {nV}
\tl_if_eq:nVTF {\l_a_tl} {\l_c_tl} {True} {False}
|\l_a_tl|\l_c_tl|
\ExplSyntaxOff
\end{document}
```
第二次修改,判断成功!
```tex
\documentclass{ctexbook}
\begin{document}
\ExplSyntaxOn
\tl_const:Nn \l_a_tl {000}
\seq_new:N \g_b_tl
\tl_new:N \l_c_tl
%改动1
\seq_push:Nn \g_b_tl {\l_a_tl}
\seq_pop:NN \g_b_tl \l_c_tl
%改动2
\cs_generate_variant:Nn \tl_if_eq:nnTF {nV}
\tl_if_eq:nVTF {\l_a_tl} {\l_c_tl} {True} {False}
|\l_a_tl|\l_c_tl|
\ExplSyntaxOff
\end{document}
```
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。