[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.