[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