我一直在尝试实现 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
允许定义谓词,但它不起作用。没办法,抱歉。