如何创建一个带有循环的可扩展条件?

如何创建一个带有循环的可扩展条件?

我需要创建一个使用循环(即..._map_function:)的可扩展条件。它应该true从循环内部返回,或者false以其他方式返回。在“普通”编程语言中,它看起来像这样(其中p是某个谓词):

for each e in S {
    if p(e) {
        return true;
    }
}
return false;

一个简单的翻译成 LaTeX3 看起来会像这样(使用 l3prop 作为示例):

\cs_new:Nn \loop_body:nn {
    \bool_if:nn
        { p(#1, #2) }
        { \prg_return_true: }
}

\prop_map_function:NN \l_prop \loop_body:nn
\prg_return_false:

但那是行不通的,因为\prg_return_false:总是会出现在输入流中,即使在可能的 之后\prg_return_true:,而这是不允许的。

那么如何才能做到这一点呢?

答案1

我不确定这是否是“推荐”的方式,但它似乎效果很好:

\cs_new:Nn \loop_body:nn {
    \bool_if:nn
        { p(#1, #2) }
        { \prop_map_break:n { \use_i:nn \prg_return_true: } }
}

\prop_map_function:NN \l_prop \loop_body:nn
\prg_return_false:

\prop_map_break:n中断循环,然后将一些标记放入输入流中。\use_i:nn然后将丢弃\prg_return_false:。这需要\prg_return_false:在循环之后立即出现。

相关内容