相同数据经压栈弹栈后数据被“修改”,如何让判断变回正确 ```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 回答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} ```

你的回答

请登录后回答

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