[latex3-commits] [git/LaTeX3-latex3-latex3] main: Speed up expandable prop mapping functions (cfaf6bd9b)
Bruno Le Floch
blflatex at gmail.com
Sat May 15 01:22:23 CEST 2021
Repository : https://github.com/latex3/latex3
On branch : main
Link : https://github.com/latex3/latex3/commit/cfaf6bd9b2213f8cd47be542b9b12d3560a9bc97
>---------------------------------------------------------------
commit cfaf6bd9b2213f8cd47be542b9b12d3560a9bc97
Author: Bruno Le Floch <blflatex at gmail.com>
Date: Sat May 15 01:22:23 2021 +0200
Speed up expandable prop mapping functions
>---------------------------------------------------------------
cfaf6bd9b2213f8cd47be542b9b12d3560a9bc97
l3kernel/CHANGELOG.md | 2 +-
l3kernel/l3prop.dtx | 60 ++++++++++++++++++++++++++++++++++-----------------
2 files changed, 41 insertions(+), 21 deletions(-)
diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index 223a7dfcf..44677a176 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -20,7 +20,7 @@ this project uses date-based 'snapshot' version identifiers.
- Checking brace balance in all regex functions (issue #377)
### Changed
-- Speed up mapping functions in l3tl, l3seq
+- Speed up mapping functions in l3tl, l3seq, l3prop
## [2021-05-11]
diff --git a/l3kernel/l3prop.dtx b/l3kernel/l3prop.dtx
index 28711889d..5d71f9399 100644
--- a/l3kernel/l3prop.dtx
+++ b/l3kernel/l3prop.dtx
@@ -1249,25 +1249,36 @@
% \prop_map_function:NN, \prop_map_function:Nc,
% \prop_map_function:cN, \prop_map_function:cc
% }
-% \begin{macro}{\@@_map_function:Nwwn}
-% The argument delimited by \cs{@@_pair:wn} is empty except at the end
-% of the loop where it is \cs{prg_break:}. No need for any quark
-% test.
+% \begin{macro}{\@@_map_function:Nw}
+% The even-numbered arguments of \cs{@@_map_function:Nw} are keys,
+% hence have string catcodes, except at the end where they are
+% \cs{fi:} \cs{prop_map_break:}. The \cs{fi:} ends the \cs{if_false:}
+% |#|\meta{even} \cs{fi:} construction and we jump out of the loop.
+% No need for any quark test.
% \begin{macrocode}
\cs_new:Npn \prop_map_function:NN #1#2
{
\exp_after:wN \use_i_ii:nnn
- \exp_after:wN \@@_map_function:Nwwn
+ \exp_after:wN \@@_map_function:Nw
\exp_after:wN #2
#1
- \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\prg_break_point:Nn \prop_map_break: { }
}
-\cs_new:Npn \@@_map_function:Nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
+\cs_new:Npn \@@_map_function:Nw #1
+ \@@_pair:wn #2 \s_@@ #3
+ \@@_pair:wn #4 \s_@@ #5
+ \@@_pair:wn #6 \s_@@ #7
+ \@@_pair:wn #8 \s_@@ #9
{
- #2
- #1 {#3} {#4}
- \@@_map_function:Nwwn #1
+ \if_false: #2 \fi: #1 {#2} {#3}
+ \if_false: #4 \fi: #1 {#4} {#5}
+ \if_false: #6 \fi: #1 {#6} {#7}
+ \if_false: #8 \fi: #1 {#8} {#9}
+ \@@_map_function:Nw #1
}
\cs_generate_variant:Nn \prop_map_function:NN { Nc , c , cc }
% \end{macrocode}
@@ -1303,26 +1314,35 @@
% \end{macro}
%
% \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn}
-% \begin{macro}{\@@_map_tokens:nwwn}
+% \begin{macro}{\@@_map_tokens:nw}
% The mapping is very similar to \cs{prop_map_function:NN}. The
% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction
% |\use:n {#1}| allows |#1| to contain any token without interfering
-% with \cs{prop_map_break:}. The loop stops when the argument
-% delimited by \cs{@@_pair:wn} is \cs{prg_break:} instead of being
-% empty.
+% with \cs{prop_map_break:}. The loop stops when the \meta{key}
+% between \cs{@@_pair:wn} and \cs{s_@@} is \cs{fi:}
+% \cs{prop_map_break:} instead of being a string.
% \begin{macrocode}
\cs_new:Npn \prop_map_tokens:Nn #1#2
{
\exp_last_unbraced:Nno
- \use_i:nn { \@@_map_tokens:nwwn {#2} } #1
- \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
+ \use_i:nn { \@@_map_tokens:nw {#2} } #1
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
+ \@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\prg_break_point:Nn \prop_map_break: { }
}
-\cs_new:Npn \@@_map_tokens:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
+\cs_new:Npn \@@_map_tokens:nw #1
+ \@@_pair:wn #2 \s_@@ #3
+ \@@_pair:wn #4 \s_@@ #5
+ \@@_pair:wn #6 \s_@@ #7
+ \@@_pair:wn #8 \s_@@ #9
{
- #2
- \use:n {#1} {#3} {#4}
- \@@_map_tokens:nwwn {#1}
+ \if_false: #2 \fi: \use:n {#1} {#2} {#3}
+ \if_false: #4 \fi: \use:n {#1} {#4} {#5}
+ \if_false: #6 \fi: \use:n {#1} {#6} {#7}
+ \if_false: #8 \fi: \use:n {#1} {#8} {#9}
+ \@@_map_tokens:nw {#1}
}
\cs_generate_variant:Nn \prop_map_tokens:Nn { c }
% \end{macrocode}
More information about the latex3-commits
mailing list.