如何获取 expl3 中用户定义函数返回的值?

如何获取 expl3 中用户定义函数返回的值?

我继续学习expl3,但我不明白用户定义函数的一些行为,它返回一个整数值(正如我所想的那样)。

我想使用返回的整数\count_number_of_elements:n进行进一步的操作。

如果我直接使用我的函数,\count_number_of_elements:n它运行良好并输出正确的数字。但我需要将其输出分配给一个整数变量。我该怎么做?


平均能量损失


一个或多或少真实的例子:“最长的 Collat​​z 序列”来自欧拉计划问题(但我想避免剧透)

\documentclass[12pt]{article}

\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \l_initial_number_int

\cs_new:Nn \count_number_of_elements:n
{
    \int_new:N \l_number_int
    \int_set:Nn \l_number_int {1}
    \int_set:Nn \l_initial_number_int {#1}
    \int_do_while:nn
    {\l_initial_number_int != 1}
    {
    \int_incr:N \l_number_int
    \int_if_even:nTF {\l_initial_number_int}
        {\int_set:Nn \l_initial_number_int {\l_initial_number_int/2} } 
        {\int_set:Nn \l_initial_number_int {3*\l_initial_number_int + 1} }
    }
    \int_use:N \l_number_int
} 

\NewDocumentCommand{\MaxNumber}{m}
{
% Code for defining starting number, produces the longest chain. According to my idea, this code should use integer number produced by \count_number_of_elements:n

% say I need get output of \count_number_of_elements:n
\int_set:Nn \l_tmpa_int {\count_number_of_elements:n {#1}}
}

\ExplSyntaxOff

\begin{document}


\end{document}

答案1

这里有两种可能的方法。如果你想允许函数在第二个参数之类的东西“内部”使用,那么\int_set:Nn它必须是可扩展。这意味着它只能使用其他本身可扩展的函数,也就是说它们用星号expl3标记。所以interface3

\cs_new:Npn \my_function:n #1
  {
    \int_eval:n {#1}
  }

会起作用,但是

\cs_new:Npn \my_function:n #1  % See below: should be protected
  {
    \int_set:Nn \l_tmpa_tl {#1}
    \int_eval:n {#1}
  }

不会照\int_set:Nn原样不是标有星号。

当您想要使用不可扩展函数时,就需要第二种方法:您必须安排设置一个用于返回的变量:

\cs_new_protected:Npn \my_function:Nn #1#2
  {
    \int_set:Nn \l_tmpa_int {#2}
    \int_set_eq:NN #1 \l_tmpa_int
  }

(当然,在实际应用中还会发生更多的事情。)


注意许多问题可以通过扩展来解决,尽管这可能会非常耗时,具体取决于手头的问题。任何涉及排版或分配的事情都是明确排除:排版没有通过扩展而产生的“结果”,而 TeX 中的赋值是不可扩展的。(如果您使用 LuaTeX,您可以在 Lua 中进行赋值,但整个问题就不同了。)


请注意不是在这里使用xparse:这些是代码级别不是文档级别命令。因此,我习惯于\cs_new:Npn创建可扩展的代码接口和 \cs_new_protected:Npn不可扩展的代码接口。

相关内容