在LaTeX3中的l3prg模块遇到这样两个函数(具体在interface3.pdf的9.8节72页),原文截取图如下:
大概意思是用来跳出递归或循环(类似python中的break),但我没看明白它们的具体意思(水平有限,解读不出它们的具体功用),所以想问问大佬们这两个函数的具体作用是什么,如果能举几个例子说明那更好,在此先行谢过!
LaTeX3 中一些 \.._map_...
函数是通过尾递归来实现的,\prg_break_point:Nn
用于标记循环要跳出时的位置,\prg_map_break:Nn
用于跳出循环。
先看一个例子,这是 \tl_map_function:nN
的简化版实现:
% \cs_new_eq:NN \prg_break_point:Nn \use_ii:nn
\cs_new:Npn \mytl_map_function:nN #1#2
{
\__mytl_map_function:Nn #2 #1 \q_recursion_tail \q_recursion_stop
\prg_break_point:Nn \mytl_map_break: { }
}
\cs_new:Npn \mytl_map_break: { \prg_map_break:Nn \mytl_map_break: { } }
\cs_new:Npn \__mytl_map_function:Nn #1#2
{
\quark_if_recursion_tail_stop:n {#2}
#1 {#2}
\__mytl_map_function:Nn #1
}
\__mytl_map_function:Nn
有两个参数,第一个是 function,第二个是 tl 的某一项。
比如 \mytl_map_function:nN { abcd } \tl_show:n
,\__mytl_map_function:Nn
第一个参数都是 \tl_show:n
,第二个参数依次是 a
,b
,c
,d
,\q_recursion_tail
。
当第二个参数不是 \q_recursion_tail
时,先执行 \tl_show:n { .. }
,然后继续执行 \__mytl_map_function:Nn
;当发现第二个参数是 \q_recursion_tail
时,它吞掉 \q_recursion_stop
及其之前的内容,尾递归结束。
但如果改为:
\cs_new:Npn \__my_if_not_c_show:n #1
{
\tl_if_eq:nnTF {#1} { c }
{ \mytl_map_break: }
{ \tl_show:n {#1} }
}
\mytl_map_function:nN { abcd } \__my_if_not_c_show:n
那么当第二个参数是 c
时,会直接跳出循环,跳出的位置正是 \prg_break_point:Nn
所在的位置。\prg_map_break:Nn
和 \prg_break_point:Nn
的第一个参数是用于标记不同类型的 map 的,\tl_map_...
是 \tl_map_break:
,\seq_map_...
则是 \seq_map_break:
。
相当于某些编程语言里的 goto
,只是 \prg_map_break:Nn
只能向后跳转。
这个例子同时也演示了 \quark_if_recursion_tail_stop:n
的用法。
感谢雾月大佬!每次讲解都入木三分,幸亏有前辈在,在学习LaTeX3时遇到不会的还有个问处。(昨天出差在路上,没能及时回复您的消息,非常抱歉。)