我需要创建一个使用循环(即..._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:
在循环之后立即出现。