[latex3-commits] [latex3/latex3] conditional-forms: Remove tracking expandablity for conditional generate (b42e0f87d)

github at latex-project.org github at latex-project.org
Sat Nov 23 09:57:22 CET 2024


Repository : https://github.com/latex3/latex3
On branch  : conditional-forms
Link       : https://github.com/latex3/latex3/commit/b42e0f87d599ef38fa27df3b5e6f4cda6a75ef89

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

commit b42e0f87d599ef38fa27df3b5e6f4cda6a75ef89
Author: Joseph Wright <joseph at texdev.net>
Date:   Tue Nov 19 16:04:57 2024 +0000

    Remove tracking expandablity for conditional generate
    
    Part of a fix for #1189.


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

b42e0f87d599ef38fa27df3b5e6f4cda6a75ef89
 l3kernel/l3basics.dtx              | 176 +++++++++++++++++--------------------
 l3kernel/l3msg.dtx                 |   7 --
 l3kernel/testfiles/m3basics002.lvt |   6 +-
 l3kernel/testfiles/m3basics002.tlg |  15 ----
 4 files changed, 82 insertions(+), 122 deletions(-)

diff --git a/l3kernel/l3basics.dtx b/l3kernel/l3basics.dtx
index 934bffb39..f4815d260 100644
--- a/l3kernel/l3basics.dtx
+++ b/l3kernel/l3basics.dtx
@@ -1949,38 +1949,37 @@
 %     \prg_gset_protected_conditional:Npnn,
 %     \prg_new_protected_conditional:Npnn
 %   }
-% \begin{macro}{\@@_generate_conditional_parm:NNNpnn}
+% \begin{macro}{\@@_generate_conditional_parm:NNpnn}
 %   The user functions for the types using parameter text from the
 %   programmer. The various functions only differ by which function is
 %   used for the assignment. For those |Npnn| type functions, we must
 %   grab the parameter text, reading everything up to a left brace
 %   before continuing. Then split the base function into name and
 %   signature, and feed \Arg{name} \Arg{signature} \meta{boolean}
-%   \Arg{set~or~new} \Arg{maybe~protected} \Arg{parameters} |{TF,...}|
+%   \Arg{set~or~new} \Arg{parameters} |{TF,...}|
 %   \Arg{code} to the auxiliary function responsible for defining all
 %   conditionals.
-%   Note that |e| stands for expandable and |p| for protected.
 %    \begin{macrocode}
 \cs_gset_protected:Npn \prg_set_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_set:Npn e }
+  { \@@_generate_conditional_parm:NNpnn \cs_set:Npn }
 \cs_gset_protected:Npn \prg_gset_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_gset:Npn e }
+  { \@@_generate_conditional_parm:NNpnn \cs_gset:Npn }
 \cs_gset_protected:Npn \prg_new_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_new:Npn e }
+  { \@@_generate_conditional_parm:NNpnn \cs_new:Npn }
 \cs_gset_protected:Npn \prg_set_protected_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_set_protected:Npn p }
+  { \@@_generate_conditional_parm:NNpnn \cs_set_protected:Npn }
 \cs_gset_protected:Npn \prg_gset_protected_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_gset_protected:Npn p }
+  { \@@_generate_conditional_parm:NNpnn \cs_gset_protected:Npn }
 \cs_gset_protected:Npn \prg_new_protected_conditional:Npnn
-  { \@@_generate_conditional_parm:NNNpnn \cs_new_protected:Npn p }
-\cs_gset_protected:Npn \@@_generate_conditional_parm:NNNpnn #1#2#3#4#
+  { \@@_generate_conditional_parm:NNpnn \cs_new_protected:Npn }
+\cs_gset_protected:Npn \@@_generate_conditional_parm:NNpnn #1#2#3#
   {
     \use:e
       {
-        \@@_generate_conditional:nnNNNnnn
-          \cs_split_function:N #3
+        \@@_generate_conditional:nnNNnnn
+          \cs_split_function:N #2
       }
-      #1 #2 {#4}
+      #1 {#3}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1997,8 +1996,8 @@
 %   }
 % \begin{macro}
 %   {
-%     \@@_generate_conditional_count:NNNnn ,
-%     \@@_generate_conditional_count:nnNNNnn
+%     \@@_generate_conditional_count:NNnn ,
+%     \@@_generate_conditional_count:nnNNnn
 %   }
 %   The user functions for the types automatically inserting the correct
 %   parameter text based on the signature. The various functions only
@@ -2006,7 +2005,7 @@
 %   function into name and signature.  The second auxiliary generates
 %   the parameter text from the number of letters in the signature.
 %   Then feed \Arg{name} \Arg{signature} \meta{boolean} \Arg{set~or~new}
-%   \Arg{maybe~protected} \Arg{parameters} |{TF,...}| \Arg{code} to the
+%   \Arg{parameters} |{TF,...}| \Arg{code} to the
 %   auxiliary function responsible for defining all conditionals.  If
 %   the \meta{signature} has more than $9$ letters, the definition is
 %   aborted since \TeX{} macros have at most $9$ arguments.  The
@@ -2014,30 +2013,30 @@
 %   later.
 %    \begin{macrocode}
 \cs_gset_protected:Npn \prg_set_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_set:Npn e }
+  { \@@_generate_conditional_count:NNnn \cs_set:Npn }
 \cs_gset_protected:Npn \prg_gset_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_set:Npn e }
+  { \@@_generate_conditional_count:NNnn \cs_set:Npn }
 \cs_gset_protected:Npn \prg_new_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_new:Npn e }
+  { \@@_generate_conditional_count:NNnn \cs_new:Npn }
 \cs_gset_protected:Npn \prg_set_protected_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_set_protected:Npn p }
+  { \@@_generate_conditional_count:NNnn \cs_set_protected:Npn }
 \cs_gset_protected:Npn \prg_gset_protected_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_gset_protected:Npn p }
+  { \@@_generate_conditional_count:NNnn \cs_gset_protected:Npn }
 \cs_gset_protected:Npn \prg_new_protected_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_new_protected:Npn p }
-\cs_gset_protected:Npn \@@_generate_conditional_count:NNNnn #1#2#3
+  { \@@_generate_conditional_count:NNnn \cs_new_protected:Npn }
+\cs_gset_protected:Npn \@@_generate_conditional_count:NNnn #1#2
   {
     \use:e
       {
-        \@@_generate_conditional_count:nnNNNnn
-        \cs_split_function:N #3
+        \@@_generate_conditional_count:nnNNnn
+        \cs_split_function:N #2
       }
-      #1 #2
+      #1
   }
-\cs_gset_protected:Npn \@@_generate_conditional_count:nnNNNnn #1#2#3#4#5
+\cs_gset_protected:Npn \@@_generate_conditional_count:nnNNnn #1#2#3#4
   {
     \__kernel_cs_parm_from_arg_count:nnF
-      { \@@_generate_conditional:nnNNNnnn {#1} {#2} #3 #4 #5 }
+      { \@@_generate_conditional:nnNNnnn {#1} {#2} #3 #4 }
       { \tl_count:n {#2} }
       {
         \msg_error:nnee { kernel } { bad-number-of-arguments }
@@ -2052,8 +2051,8 @@
 %
 % \begin{macro}
 %   {
-%     \@@_generate_conditional:nnNNNnnn,
-%     \@@_generate_conditional:NNnnnnNw,
+%     \@@_generate_conditional:nnNNnnn,
+%     \@@_generate_conditional:NnnnnNw,
 %     \@@_generate_conditional_test:w,
 %     \@@_generate_conditional_fast:nw,
 %   }
@@ -2062,9 +2061,9 @@
 %   the base form of the conditional, which gives the name, signature
 %   and a boolean to signal whether or not there was a colon in the
 %   name. In the absence of a colon, we throw an error and don't define
-%   any conditional. The fourth and fifth arguments build up the
-%   defining function.  The sixth is the parameters to use (possibly
-%   empty), the seventh is the list of forms to define, the eighth is the
+%   any conditional. The fourth arguments builds up the
+%   defining function.  The fifth is the parameters to use (possibly
+%   empty), the sixth is the list of forms to define, the seventh is the
 %   replacement text which we will augment when defining the forms.
 %   The use of \cs{tl_to_str:n} makes the later loop more robust.
 %
@@ -2073,9 +2072,9 @@
 %   we optimize this special case by calling
 %   \cs{@@_generate_conditional_fast:nw} \Arg{code}.  This passes
 %   \cs{use_i:nn} instead of \cs{use_i_ii:nnn} to functions such as
-%   \cs{@@_generate_p_form:wNNnnnnN}.
+%   \cs{@@_generate_p_form:wNnnnnN}.
 %    \begin{macrocode}
-\cs_gset_protected:Npn \@@_generate_conditional:nnNNNnnn #1#2#3#4#5#6#7#8
+\cs_gset_protected:Npn \@@_generate_conditional:nnNNnnn #1#2#3#4#5#6#7
   {
     \if_meaning:w \c_false_bool #3
       \msg_error:nne { kernel } { missing-colon }
@@ -2084,15 +2083,15 @@
     \fi:
     \use:e
       {
-        \exp_not:N \@@_generate_conditional:NNnnnnNw
-        \exp_not:n { #4 #5 {#1} {#2} {#6} }
+        \exp_not:N \@@_generate_conditional:NnnnnNw
+        \exp_not:n { #4 {#1} {#2} {#5} }
         \@@_generate_conditional_test:w
-          #8 \s_@@_mark
+          #7 \s_@@_mark
             \@@_generate_conditional_fast:nw
           \prg_return_true: \else: \prg_return_false: \fi: \s_@@_mark
             \use_none:n
-        \exp_not:n { {#8} \use_i_ii:nnn }
-        \tl_to_str:n {#7}
+        \exp_not:n { {#7} \use_i_ii:nnn }
+        \tl_to_str:n {#6}
         \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
       }
   }
@@ -2102,54 +2101,52 @@
 \cs_gset:Npn \@@_generate_conditional_fast:nw #1#2 \exp_not:n #3
   { \exp_not:n { {#1} \use_i:nn } }
 %    \end{macrocode}
-%   Looping through the list of desired forms.  First are six arguments
-%   and seventh is the form.  Use the form to call the
+%   Looping through the list of desired forms.  First are five arguments
+%   and sixth is the form.  Use the form to call the
 %   correct type.  If the form does not exist, the \cs{use:c}
 %   construction results in \tn{relax}, and the error message is
 %   displayed (unless the form is empty, to allow for |{T, , F}|),
 %   then \cs{use_none:nnnnnnnn} cleans up.  Otherwise, the
 %   error message is removed by the variant form.
 %    \begin{macrocode}
-\cs_gset_protected:Npn \@@_generate_conditional:NNnnnnNw #1#2#3#4#5#6#7#8 ,
+\cs_gset_protected:Npn \@@_generate_conditional:NnnnnNw #1#2#3#4#5#6#7 ,
   {
-    \if_meaning:w \q_@@_recursion_tail #8
+    \if_meaning:w \q_@@_recursion_tail #7
       \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
     \fi:
-    \use:c { @@_generate_ #8 _form:wNNnnnnN }
-        \tl_if_empty:nF {#8}
+    \use:c { @@_generate_ #7 _form:wNnnnnN }
+        \tl_if_empty:nF {#7}
           {
             \msg_error:nnee
               { kernel } { conditional-form-unknown }
-              {#8} { \token_to_str:c { #3 : #4 } }
+              {#7} { \token_to_str:c { #2 : #3 } }
           }
         \use_none:nnnnnnnn
       \s_@@_stop
-      #1 #2 {#3} {#4} {#5} {#6} #7
-    \@@_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7
+      #1 {#2} {#3} {#4} {#5} #6
+    \@@_generate_conditional:NnnnnNw #1 {#2} {#3} {#4} {#5} #6
   }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}
 %   {
-%     \@@_generate_p_form:wNNnnnnN,
-%     \@@_generate_TF_form:wNNnnnnN,
-%     \@@_generate_T_form:wNNnnnnN,
-%     \@@_generate_F_form:wNNnnnnN
+%     \@@_generate_p_form:wNnnnnN,
+%     \@@_generate_TF_form:wNnnnnN,
+%     \@@_generate_T_form:wNnnnnN,
+%     \@@_generate_F_form:wNnnnnN
 %   }
 % \begin{macro}[EXP]{\@@_p_true:w, \@@_T_true:w, \@@_F_true:w, \@@_TF_true:w}
 %   How to generate the various forms. Those functions take the
-%   following arguments: 1: junk, 2: \cs{cs_set:Npn} or similar, 3: |p|
-%   (for protected conditionals) or |e|, 4: function name, 5: signature,
-%   6: parameter text, 7: replacement (possibly trimmed by
-%   \cs{@@_generate_conditional_fast:nw}), 8: \cs{use_i_ii:nnn} or
+%   following arguments: 1: junk, 2: \cs{cs_set:Npn} or similar,
+%   3: function name, 4: signature,
+%   5: parameter text, 6: replacement (possibly trimmed by
+%   \cs{@@_generate_conditional_fast:nw}), 7: \cs{use_i_ii:nnn} or
 %   \cs{use_i:nn} (for \enquote{fast} conditionals).  Remember that the
 %   logic-returning functions expect two arguments to be present after
 %   \cs{exp_end:}: notice the construction of the different variants
 %   relies on this, and that the |TF| and |F| variants will be slightly
-%   faster than the |T| version.  The |p| form is only valid for
-%   expandable tests, we check for that by making sure that the second
-%   argument is empty.  For \enquote{fast} conditionals, |#7| has an
+%   faster than the |T| version.  For \enquote{fast} conditionals, |#7| has an
 %   extra \cs[no-index]{if_\ldots{}}.  To optimize a bit further we
 %   don't use \cs{exp_after:wN} \cs{use_ii:nnn} and similar but instead use
 %   \cs{@@_TF_true:w} and similar to swap out the macro after \cs{fi:}. It would
@@ -2157,48 +2154,37 @@
 %   but if those are actually missing, the recovery from the runaway argument
 %   would not insert \cs{fi:} back, messing up nesting of conditionals.
 %    \begin{macrocode}
-\cs_gset_protected:Npn \@@_generate_p_form:wNNnnnnN
-    #1 \s_@@_stop #2#3#4#5#6#7#8
+\cs_gset_protected:Npn \@@_generate_p_form:wNnnnnN
+    #1 \s_@@_stop #2#3#4#5#6#7
   {
-    \if_meaning:w e #3
-      \exp_after:wN \use_i:nn
-    \else:
-      \exp_after:wN \use_ii:nn
-    \fi:
-      {
-        #8
-          { \exp_args:Nc #2 { #4 _p: #5 } #6 }
-          { { #7 \exp_end: \c_true_bool \c_false_bool } }
-          { #7 \@@_p_true:w \fi: \c_false_bool }
-      }
-      {
-        \msg_error:nne { kernel } { protected-predicate }
-          { \token_to_str:c { #4 _p: #5 } }
-      }
+    #7
+      { \exp_args:Nc #2 { #3 _p: #4 } #5 }
+      { { #6 \exp_end: \c_true_bool \c_false_bool } }
+      { #6 \@@_p_true:w \fi: \c_false_bool }
   }
-\cs_gset_protected:Npn \@@_generate_T_form:wNNnnnnN
-    #1 \s_@@_stop #2#3#4#5#6#7#8
+\cs_gset_protected:Npn \@@_generate_T_form:wNnnnnN
+    #1 \s_@@_stop #2#3#4#5#6#7
   {
-    #8
-      { \exp_args:Nc #2 { #4 : #5 T } #6 }
-      { { #7 \exp_end: \use:n \use_none:n } }
-      { #7 \@@_T_true:w \fi: \use_none:n }
+    #7
+      { \exp_args:Nc #2 { #3 : #4 T } #5 }
+      { { #6 \exp_end: \use:n \use_none:n } }
+      { #6 \@@_T_true:w \fi: \use_none:n }
   }
-\cs_gset_protected:Npn \@@_generate_F_form:wNNnnnnN
-    #1 \s_@@_stop #2#3#4#5#6#7#8
+\cs_gset_protected:Npn \@@_generate_F_form:wNnnnnN
+    #1 \s_@@_stop #2#3#4#5#6#7
   {
-    #8
-      { \exp_args:Nc #2 { #4 : #5 F } #6 }
-      { { #7 \exp_end: { } } }
-      { #7 \@@_F_true:w \fi: \use:n }
+    #7
+      { \exp_args:Nc #2 { #3 : #4 F } #5 }
+      { { #6 \exp_end: { } } }
+      { #6 \@@_F_true:w \fi: \use:n }
   }
-\cs_gset_protected:Npn \@@_generate_TF_form:wNNnnnnN
-    #1 \s_@@_stop #2#3#4#5#6#7#8
+\cs_gset_protected:Npn \@@_generate_TF_form:wNnnnnN
+    #1 \s_@@_stop #2#3#4#5#6#7
   {
-    #8
-      { \exp_args:Nc #2 { #4 : #5 TF } #6 }
-      { { #7 \exp_end: } }
-      { #7 \@@_TF_true:w \fi: \use_ii:nn }
+    #7
+      { \exp_args:Nc #2 { #3 : #4 TF } #5 }
+      { { #6 \exp_end: } }
+      { #6 \@@_TF_true:w \fi: \use_ii:nn }
   }
 \cs_gset:Npn \@@_p_true:w  \fi: \c_false_bool { \fi: \c_true_bool }
 \cs_gset:Npn \@@_T_true:w  \fi: \use_none:n   { \fi: \use:n }
diff --git a/l3kernel/l3msg.dtx b/l3kernel/l3msg.dtx
index 68058724e..0373f6837 100644
--- a/l3kernel/l3msg.dtx
+++ b/l3kernel/l3msg.dtx
@@ -2079,13 +2079,6 @@
     An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~
     array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3.
   }
-\msg_new:nnnn { kernel } { protected-predicate }
-  { Predicate~'#1'~must~be~expandable. }
-  {
-    \c_@@_coding_error_text_tl
-    LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
-    Only~expandable~tests~can~have~a~predicate~version.
-  }
 \msg_new:nnn { kernel } { randint-backward-range }
   { Wrong~order~of~bounds~in~\iow_char:N\\int_rand:nn{#1}{#2}. }
 \msg_new:nnnn { kernel } { conditional-form-unknown }
diff --git a/l3kernel/testfiles/m3basics002.lvt b/l3kernel/testfiles/m3basics002.lvt
index ef11f113d..8d83d15db 100644
--- a/l3kernel/testfiles/m3basics002.lvt
+++ b/l3kernel/testfiles/m3basics002.lvt
@@ -87,7 +87,7 @@
 %%%%%%%%%%%%%%%%%%%%%
 \TEST { prg_new_conditional:Nnn }
   {
-    \prg_new_protected_conditional:Nnn \foo:nnn { T , , F , TF , }
+    \prg_new_protected_conditional:Nnn \foo:nnn { T , F , TF }
       { \tl_show:n { #1 #2 #3 } \prg_return_true: }
     \cs_log:N \foo:nnnT
     \cs_log:N \foo:nnnF
@@ -108,10 +108,6 @@
     \prg_new_conditional:Nnn \foo:nnnnnnnnnnnn { TF }
       { \prg_return_true: }
     \cs_log:N \foo:nnnnnnnnnnnnTF
-    \prg_new_protected_conditional:Npnn \baz:n #1 { p , xx , TF }
-      { \prg_return_true: }
-    \cs_log:N \baz_p:n
-    \cs_log:N \baz:nTF
   }
 
 %%%%%%%%%%%%%%%%%%%%%
diff --git a/l3kernel/testfiles/m3basics002.tlg b/l3kernel/testfiles/m3basics002.tlg
index 01d8c92fe..9c534d21d 100644
--- a/l3kernel/testfiles/m3basics002.tlg
+++ b/l3kernel/testfiles/m3basics002.tlg
@@ -138,21 +138,6 @@ l. ...  }
 This is a coding error.
 LaTeX has been asked to define a function '\foo:nnnnnnnnnnnn' with 12 arguments. TeX allows between 0 and 9 arguments for a single function.
 > \foo:nnnnnnnnnnnnTF=undefined.
-! LaTeX Error: Predicate '\baz_p:n' must be expandable.
-For immediate help type H <return>.
- ...                                              
-l. ...  }
-This is a coding error.
-LaTeX has been asked to define '\baz_p:n' as a protected predicate. Only expandable tests can have a predicate version.
-! LaTeX Error: Conditional form 'xx' for function '\baz:n' unknown.
-For immediate help type H <return>.
- ...                                              
-l. ...  }
-This is a coding error.
-LaTeX has been asked to define the conditional form 'xx' of the function '\baz:n', but only 'TF', 'T', 'F', and 'p' forms exist.
-Defining \baz:nTF on line ...
-> \baz_p:n=\relax.
-> \baz:nTF=\protected\long macro:#1->\prg_return_true: \exp_end: .
 ============================================================
 ============================================================
 TEST 8: prg_set_eq_conditional:NNn





More information about the latex3-commits mailing list.