[latex3-commits] [git/LaTeX3-latex3-latex3] master: Simplify "...?...:..." ternary operator in l3fp, and support tuples (see #438) (54d5e27)

Bruno Le Floch bruno at le-floch.fr
Sun Feb 25 17:04:57 CET 2018


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/54d5e279c0b7b868538d98e0bdb44d80043d523a

>---------------------------------------------------------------

commit 54d5e279c0b7b868538d98e0bdb44d80043d523a
Author: Bruno Le Floch <bruno at le-floch.fr>
Date:   Sun Feb 25 10:38:03 2018 -0500

    Simplify "...?...:..." ternary operator in l3fp, and support tuples (see #438)
    
    The loop had been added to support situations where multiple floating
    point numbers were given to this operator.  Tuples now show up differently.


>---------------------------------------------------------------

54d5e279c0b7b868538d98e0bdb44d80043d523a
 l3kernel/l3fp-logic.dtx                 |   53 ++++++++++---------------------
 l3kernel/testfiles/m3expl001.luatex.tlg |    3 --
 l3kernel/testfiles/m3expl001.ptex.tlg   |    3 --
 l3kernel/testfiles/m3expl001.tlg        |    3 --
 l3kernel/testfiles/m3expl001.uptex.tlg  |    3 --
 l3kernel/testfiles/m3expl001.xetex.tlg  |    3 --
 l3kernel/testfiles/m3expl003.luatex.tlg |    3 --
 l3kernel/testfiles/m3expl003.ptex.tlg   |    3 --
 l3kernel/testfiles/m3expl003.tlg        |    3 --
 l3kernel/testfiles/m3expl003.uptex.tlg  |    3 --
 l3kernel/testfiles/m3expl003.xetex.tlg  |    3 --
 l3kernel/testfiles/m3fp-logic002.lvt    |    5 +++
 l3kernel/testfiles/m3fp-logic002.tlg    |   23 ++++++++++++++
 13 files changed, 45 insertions(+), 66 deletions(-)

diff --git a/l3kernel/l3fp-logic.dtx b/l3kernel/l3fp-logic.dtx
index 2e33b9f..558097b 100644
--- a/l3kernel/l3fp-logic.dtx
+++ b/l3kernel/l3fp-logic.dtx
@@ -571,32 +571,28 @@
 %
 % \subsection{Ternary operator}
 %
-%^^A todo: understand and optimize.
 % \begin{macro}[EXP]
 %   {\@@_ternary:NwwN, \@@_ternary_auxi:NwwN, \@@_ternary_auxii:NwwN}
-% \begin{macro}[EXP]
-%   {
-%     \@@_ternary_loop_break:w, \@@_ternary_loop:Nw,
-%     \@@_ternary_map_break:, \@@_ternary_break_point:n
-%   }
 %   The first function receives the test and the true branch of the |?:|
-%   ternary operator.  It returns the true branch, unless the test
-%   branch is zero.  In that case, the function returns a very specific
-%   \texttt{nan}.  The second function receives the output of the first
-%   function, and the false branch.  It returns the previous input,
-%   unless that is the special \texttt{nan}, in which case we return the
-%   false branch.
+%   ternary operator.  It calls \cs{@@_ternary_auxii:NwwN} if the test
+%   branch is a floating point number $\pm 0$, and otherwise calls
+%   \cs{@@_ternary_auxi:NwwN}.  These functions select one of their two
+%   arguments.
 %    \begin{macrocode}
-\cs_new:Npn \@@_ternary:NwwN #1 #2@ #3@ #4
+\cs_new:Npn \@@_ternary:NwwN #1 #2#3@ #4@ #5
   {
-    \if_meaning:w \@@_parse_infix_::N #4
-      \@@_ternary_loop:Nw
-        #2
-        \s_@@ \@@_chk:w { \@@_ternary_loop_break:w } ;
-      \@@_ternary_break_point:n { \exp_after:wN \@@_ternary_auxi:NwwN }
+    \if_meaning:w \@@_parse_infix_::N #5
+      \if_charcode:w 0
+            \@@_if_type_fp:NTwFw
+              #2 { \use_i:nn \use_i_delimit_by_q_stop:nw #3 \q_stop }
+              \s_@@ 1 \q_stop
+        \exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxii:NwwN
+      \else:
+        \exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxi:NwwN
+      \fi:
       \exp_after:wN #1
       \exp:w \exp_end_continue_f:w
-      \@@_exp_after_array_f:w #3 \s_@@_stop
+      \@@_exp_after_array_f:w #4 \s_@@_stop
       \exp_after:wN @
       \exp:w
         \@@_parse_operand:Nw \c_@@_prec_colon_int
@@ -607,25 +603,11 @@
       \exp_after:wN \@@_parse_continue:NwN
       \exp_after:wN #1
       \exp:w \exp_end_continue_f:w
-      \@@_exp_after_array_f:w #3 \s_@@_stop
-      \exp_after:wN #4
+      \@@_exp_after_array_f:w #4 \s_@@_stop
+      \exp_after:wN #5
       \exp_after:wN #1
     \fi:
   }
-\cs_new:Npn \@@_ternary_loop_break:w
-    #1 \fi: #2 \@@_ternary_break_point:n #3
-  {
-    0 = 0 \exp_stop_f: \fi:
-    \exp_after:wN \@@_ternary_auxii:NwwN
-  }
-\cs_new:Npn \@@_ternary_loop:Nw \s_@@ \@@_chk:w #1#2;
-  {
-    \if_int_compare:w #1 > 0 \exp_stop_f:
-      \exp_after:wN \@@_ternary_map_break:
-    \fi:
-    \@@_ternary_loop:Nw
-  }
-\cs_new:Npn \@@_ternary_map_break: #1 \@@_ternary_break_point:n #2 {#2}
 \cs_new:Npn \@@_ternary_auxi:NwwN #1#2@#3@#4
   {
     \exp_after:wN \@@_parse_continue:NwN
@@ -644,7 +626,6 @@
   }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 %    \begin{macrocode}
 %</initex|package>
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index fe6a3b1..4726754 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -4101,9 +4101,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 5644bac..6de67ce 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 626911d..e85f323 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 76dab5c..2ff99e8 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 0d51b71..a21353d 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -4099,9 +4099,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index fe6a3b1..4726754 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -4101,9 +4101,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 5644bac..6de67ce 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 626911d..e85f323 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index 76dab5c..2ff99e8 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -4089,9 +4089,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 0d51b71..a21353d 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -4099,9 +4099,6 @@ Defining \__fp_tuple_|_o:ww on line ...
 Defining \__fp_tuple_|_tuple_o:ww on line ...
 Defining \__fp_and_return:wNw on line ...
 Defining \__fp_ternary:NwwN on line ...
-Defining \__fp_ternary_loop_break:w on line ...
-Defining \__fp_ternary_loop:Nw on line ...
-Defining \__fp_ternary_map_break: on line ...
 Defining \__fp_ternary_auxi:NwwN on line ...
 Defining \__fp_ternary_auxii:NwwN on line ...
 Defining \__fp_parse_word_abs:N on line ...
diff --git a/l3kernel/testfiles/m3fp-logic002.lvt b/l3kernel/testfiles/m3fp-logic002.lvt
index 6f598c7..109c3d6 100644
--- a/l3kernel/testfiles/m3fp-logic002.lvt
+++ b/l3kernel/testfiles/m3fp-logic002.lvt
@@ -52,12 +52,17 @@
     \fp_to_tl:n { 0=1 ? 2 : 3>2 ? 4 : 5 } \NEWLINE
     \fp_to_tl:n {-0=1 ? 2 : 3>2 ? 4 : 5 } \NEWLINE
     \fp_to_tl:n { 0=1 ? 2 : 0>2 ? 4 : 5 } \NEWLINE
+    \fp_to_tl:n { (0,1) ? 2 : 4 } \NEWLINE
+    \fp_to_tl:n { (0,1) ? (2,3) : (4,5) } \NEWLINE
+    \fp_to_tl:n { -0 ? () : (4,5) ? 9 : 4 , 9 } \NEWLINE
+    \fp_to_tl:n { 1 ? (2,) : () } \NEWLINE
   }
 \TESTEXP { Ternary~operator~invalid~syntax }
   {
     \fp_to_tl:n { 1 : 2 } \NEWLINE
     \fp_to_tl:n { 1 ? 2 : 3 : 4 } \NEWLINE
     \fp_to_tl:n { ( 1 ? 2 ) : 3 } \NEWLINE
+    \fp_to_tl:n { 1 ? 2 , 3 : 4 } \NEWLINE
   }
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/l3kernel/testfiles/m3fp-logic002.tlg b/l3kernel/testfiles/m3fp-logic002.tlg
index 5fd391f..e6de254 100644
--- a/l3kernel/testfiles/m3fp-logic002.tlg
+++ b/l3kernel/testfiles/m3fp-logic002.tlg
@@ -49,6 +49,10 @@ TEST 5: Ternary operator
 4
 4
 5
+2
+(2, 3)
+(9, 9)
+(2,)
 ============================================================
 ============================================================
 TEST 6: Ternary operator invalid syntax
@@ -89,9 +93,28 @@ of your error message was never \def'ed. If you have
 misspelled it (e.g., `\hobx'), type `I' and the correct
 spelling (e.g., `I\hbox'). Otherwise just continue,
 and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+                           Missing : inserted for ?:.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+                           Missing ? inserted for ?:.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
 2
 2
 3
+(2, 4)
 ============================================================
 ============================================================
 TEST 7: Booleans true and false





More information about the latex3-commits mailing list