布尔评估导致缺失数字错误

布尔评估导致缺失数字错误

我一直在尝试实现 Stein 算法来查找两个数字之间的 gcd,但遇到了一个我无法弄清楚的错误。下面是一个没有算法的 MWE,但说明了这个问题。由于某种我不知道的原因,导致每次循环迭代\bool_until_do:nn { \binary_if_zero_p:N #1 }都会出现两次错误,因此最终陷入无限循环。经过一些测试,我感觉它与内部! Missing number, treated as zero.有关,因为我可以用任何其他条件语句替换它(为了简单起见),它运行良好。\tl_if_in:NnTF\binary_if_zero:N\int_compare:nNnTF {1} = {0} {...} {...}

\documentclass{article}

\ExplSyntaxOn

\tl_new:N \l__binary_tmpa_tl

\prg_new_conditional:Npnn \binary_if_zero:N #1 { p }
{
    \tl_if_in:NnTF #1 { 1 }
    { \prg_return_false: }
    { \prg_return_true: }
}

\cs_new:Npn \binary_test:N #1
{
    \bool_until_do:nn { \binary_if_zero_p:N #1 }
    {
        % some code but for simplicity we write
        \binary_set:Nn \l__binary_tmpa_tl { 0 }
    }
}

\cs_new:Npn \binary_set:Nn #1 #2
{ \tl_set:Nx #1 { \int_to_bin:n {#2} } }

\NewDocumentCommand{\test}{ m }
{
    \binary_set:Nn \l__binary_tmpa_tl {#1}
    \binary_test:N \l__binary_tmpa_tl
}

\ExplSyntaxOff

\begin{document}
    \test{6}
\end{document}

答案1

该函数\tl_if_in:NnTF不是完全可扩展的,因此您无法从中定义谓词。

实际上,没有哪个...if_in...功能是可以完全扩展的。所以你需要一些不同的方法。

此外,指南建议protected在要定义的函数依赖于不可扩展的函数时使用;你可以这样做

\prg_new_protected_conditional:Npnn \binary_if_zero:N #1 { T,F,TF }
  {
    \tl_if_in:NnTF #1 { 1 }
    { \prg_return_false: }
    { \prg_return_true: }
  }

但没有谓语形式。

在您的例子中,\prg_new_conditional:Nnn允许定义谓词,但它不起作用。没办法,抱歉。

相关内容