是否可以在 \int_eval:n 中使用不可扩展的 cs

是否可以在 \int_eval:n 中使用不可扩展的 cs

参见下面的代码,前两个例子没有问题,而最后一个却出现了错误。

可能的原因是\seq_if_in:NnTF不可扩展。

但是我想检查参数,如果参数不包含在某个序列中,则打印一些错误消息,同时使命令能够在其中使用\int_eval:n或嵌套。

有什么办法吗?

\documentclass{article}
\usepackage{xparse}

\begin{document}
\ExplSyntaxOn
\seq_set_from_clist:Nn \l_tmpa_seq { 1, 2, 3 }
\cs_new:Nn \__add_one_or_two:n
  {
    \seq_if_in:NnTF \l_tmpa_seq { #1 }
      { \int_eval:n { #1 + 1} }
      { \int_eval:n { #1 + 2} }
  }
% example 1, fine
\__add_one_or_two:n { 3 }
% example 2, fine
\__add_one_or_two:n { 4 }
% example 3
\int_eval:n { 2 + \__add_one_or_two:n { 5 } }
\ExplSyntaxOff
\end{document}

答案1

\seq_if_in:Nn(TF)不可扩展,因为序列中的标记可能具有不同的 catcode:

\exp_args:NNx \seq_set_from_clist:Nn \l_tmpa_seq { \token_to_str:N : }
\seq_show:N \l_tmpa_seq
\seq_if_in:NnTF \l_tmpa_seq { : }
  { \show\T } { \show\F }

并且您无法(合理地)对其进行扩展测试。

另一方面,房产清单有关键的总是变成字符串,因此\prop_if_in:Nn(TF)可以扩展。如果你可以更改数据类型,则可以滥用属性列表作为无 catcode 序列,从而允许扩展查询:

\documentclass{article}
\usepackage{xparse}

\begin{document}
\ExplSyntaxOn
\prop_set_from_keyval:Nn \l_tmpa_prop
  { %  v empty values
    1 = ,
    2 = ,
    3 =
  }
\cs_new:Nn \__add_one_or_two:n
  {
    \prop_if_in:NnTF \l_tmpa_prop { #1 }
      { \int_eval:n { #1 + 1} }
      { \int_eval:n { #1 + 2} }
  }
% example 1, fine
\__add_one_or_two:n { 3 }
% example 2, fine
\__add_one_or_two:n { 4 }
% example 3
\int_eval:n { 2 + \__add_one_or_two:n { 5 } }
\ExplSyntaxOff
\end{document}

相关内容