Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision 5cefa433745f174ac307ad32f414eb2fef7476a2)
+++ doc/user/user.tex	(revision 1bcbf025a64d88a84a86c7b5d07e08eaeefc8b36)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Mon Feb 14 17:20:39 2022
-%% Update Count     : 5382
+%% Last Modified On : Mon Aug 22 23:43:30 2022
+%% Update Count     : 5503
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -964,50 +964,53 @@
 
 \begin{figure}
-\begin{tabular}{@{}l@{\hspace{25pt}}|l@{}}
-\multicolumn{1}{@{}c@{\hspace{25pt}}|}{loop control} & \multicolumn{1}{c@{}}{output} \\
+\begin{tabular}{@{}l@{\hspace{40pt}}|l@{}}
+\multicolumn{1}{@{}c@{\hspace{40pt}}|}{loop control} & \multicolumn{1}{c@{}}{output} \\
 \hline
 \begin{cfa}
-while ®($\,$)® { sout | "empty"; break; }
-do { sout | "empty"; break; } while ®($\,$)®;
-for ®($\,$)® { sout | "empty"; break; }
-for ( ®0® ) { sout | "A"; } sout | "zero";
-for ( ®1® ) { sout | "A"; }
-for ( ®10® ) { sout | "A"; }
-for ( ®= 10® ) { sout | "A"; }
-for ( ®1 ~= 10 ~ 2® ) { sout | "B"; }
-for ( ®10 -~= 1 ~ 2® ) { sout | "C"; }
-for ( ®0.5 ~ 5.5® ) { sout | "D"; }
-for ( ®5.5 -~ 0.5® ) { sout | "E"; }
-for ( ®i; 10® ) { sout | i; }
-for ( ®i; = 10® ) { sout | i; }
-for ( ®i; 1 ~= 10 ~ 2® ) { sout | i; }
-for ( ®i; 10 -~= 1 ~ 2® ) { sout | i; }
-for ( ®i; 0.5 ~ 5.5® ) { sout | i; }
-for ( ®i; 5.5 -~ 0.5® ) { sout | i; }
-for ( ®ui; 2u ~= 10u ~ 2u® ) { sout | ui; }
-for ( ®ui; 10u -~= 2u ~ 2u® ) { sout | ui; }
+while () { sout | "empty"; break; }
+do { sout | "empty"; break; } while ();
+for () { sout | "empty"; break; }							$\C[3in]{sout | nl | nlOff;}$
+
+for ( 0 ) { sout | "A"; } sout | "zero";					$\C{sout | nl;}$
+for ( 1 ) { sout | "A"; }									$\C{sout | nl;}$
+for ( 10 ) { sout | "A"; }									$\C{sout | nl;}$
+for ( ~= 10 ) { sout | "A"; }								$\C{sout | nl;}$
+for ( 1 ~= 10 ~ 2 ) { sout | "B"; }							$\C{sout | nl;}$
+for ( 1 -~= 10 ~ 2 ) { sout | "C"; }						$\C{sout | nl;}$
+for ( 0.5 ~ 5.5 ) { sout | "D"; }							$\C{sout | nl;}$
+for ( 0.5 -~ 5.5 ) { sout | "E"; }							$\C{sout | nl;}$
+for ( i; 10 ) { sout | i; }									$\C{sout | nl;}$
+for ( i; ~= 10 ) { sout | i; }								$\C{sout | nl;}$
+for ( i; 1 ~= 10 ~ 2 ) { sout | i; }						$\C{sout | nl;}$
+for ( i; 1 -~= 10 ~ 2 ) { sout | i; }						$\C{sout | nl;}$
+for ( i; 0.5 ~ 5.5 ) { sout | i; }							$\C{sout | nl;}$
+for ( i; 0.5 -~ 5.5 ) { sout | i; }							$\C{sout | nl;}$
+for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }					$\C{sout | nl;}$
+for ( ui; 2u -~= 10u ~ 2u ) { sout | ui; }					$\C{sout | nl | nl | nl;}$
+
 enum { N = 10 };
-for ( ®N® ) { sout | "N"; }
-for ( ®i; N® ) { sout | i; }
-for ( ®i; N -~ 0® ) { sout | i; }
-const int start = 3, comp = 10, inc = 2;
-for ( ®i; start ~ comp ~ inc + 1® ) { sout | i; }
-for ( i; 1 ~ ®@® ) { if ( i > 10 ) break; sout | i; }
-for ( i; 10 -~ ®@® ) { if ( i < 0 ) break; sout | i; }
-for ( i; 2 ~ ®@® ~ 2 ) { if ( i > 10 ) break; sout | i; }
-for ( i; 2.1 ~ ®@® ~ ®@® ) { if ( i > 10.5 ) break; sout | i; i += 1.7; }
-for ( i; 10 -~ ®@® ~ 2 ) { if ( i < 0 ) break; sout | i; }
-for ( i; 12.1 ~ ®@® ~ ®@® ) { if ( i < 2.5 ) break; sout | i; i -= 1.7; }
-for ( i; 5 ®:® j; -5 ~ @ ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 -~ @ ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 ~ @ ~ 2 ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 -~ @ ~ 2 ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 ~ @ ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 -~ @ ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 ~ @ ~ 2 ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 -~ @ ~ 2 ) { sout | i | j; }
-for ( i; 5 ®:® j; -5 -~ @ ~ 2 ®:® k; 1.5 ~ @ ) { sout | i | j | k; }
-for ( i; 5 ®:® j; -5 -~ @ ~ 2 ®:® k; 1.5 ~ @ ) { sout | i | j | k; }
-for ( i; 5 ®:® k; 1.5 ~ @ ®:® j; -5 -~ @ ~ 2 ) { sout | i | j | k; }
+for ( N ) { sout | "N"; }									$\C{sout | nl;}$
+for ( i; N ) { sout | i; }									$\C{sout | nl;}$
+for ( i; -~ N ) { sout | i; }								$\C{sout | nl | nl | nl;}$
+
+const int low = 3, high = 10, inc = 2;
+for ( i; low ~ high ~ inc + 1 ) { sout | i; }				$\C{sout | nl;}$
+for ( i; 1 ~ @ ) { if ( i > 10 ) break; sout | i; }			$\C{sout | nl;}$
+for ( i; @ -~ 10 ) { if ( i < 0 ) break; sout | i; }		$\C{sout | nl;}$
+for ( i; 2 ~ @ ~ 2 ) { if ( i > 10 ) break; sout | i; }		$\C{sout | nl;}$
+for ( i; 2.1 ~ @ ~ @ ) { if ( i > 10.5 ) break; sout | i; i += 1.7; } $\C{sout | nl;}$
+for ( i; @ -~ 10 ~ 2 ) { if ( i < 0 ) break; sout | i; }	$\C{sout | nl;}$
+for ( i; 12.1 ~ @ ~ @ ) { if ( i < 2.5 ) break; sout | i; i -= 1.7; } $\C{sout | nl;}$
+for ( i; 5 : j; -5 ~ @ ) { sout | i | j; }					$\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ) { sout | i | j; }					$\C{sout | nl;}$
+for ( i; 5 : j; -5 ~ @ ~ 2 ) { sout | i | j; }				$\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ~ 2 ) { sout | i | j; }				$\C{sout | nl;}$
+for ( i; 5 : j; -5 ~ @ ) { sout | i | j; }					$\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ) { sout | i | j; }					$\C{sout | nl;}$
+for ( i; 5 : j; -5 ~ @ ~ 2 ) { sout | i | j; }				$\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ~ 2 ) { sout | i | j; }				$\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ~ 2 : k; 1.5 ~ @ ) { sout | i | j | k; } $\C{sout | nl;}$
+for ( i; 5 : j; @ -~ -5 ~ 2 : k; 1.5 ~ @ ) { sout | i | j | k; } $\C{sout | nl;}$
+for ( i; 5 : k; 1.5 ~ @ : j; @ -~ -5 ~ 2 ) { sout | i | j | k; } $\C{sout | nl;}\CRT$
 \end{cfa}
 &
@@ -1016,4 +1019,5 @@
 empty
 empty
+
 zero
 A
@@ -1033,7 +1037,9 @@
 10 8 6 4 2
 
+
 N N N N N N N N N N
 0 1 2 3 4 5 6 7 8 9
 10 9 8 7 6 5 4 3 2 1
+
 
 3 6 9
@@ -1073,23 +1079,7 @@
 
 Looping a fixed number of times, possibly with a loop index, occurs frequently.
-\CFA condenses simply looping to facilitate coding speed and safety.
-The \Indexc{for}, \Indexc{while}, and \Indexc{do} loop-control is augmented as follows \see{examples in \VRef[Figure]{f:LoopControlExamples}}:
-\begin{itemize}[itemsep=0pt]
-\item
-©0© is the implicit start value;
-\item
-©1© is the implicit increment value.
-\item
-The up-to range uses operator ©+=© for increment;
-\item
-The down-to range uses operator ©-=© for decrement.
-\item
-The loop index is polymorphic in the type of the comparison value N (when the start value is implicit) or the start value M.
-\begin{cfa}
-for ( i; ®5® )					$\C[2.5in]{// typeof(5) i; 5 is comparison value}$
-for ( i; ®1.5®~5.5~0.5 )		$\C{// typeof(1.5) i; 1.5 is start value}$
-\end{cfa}
-\item
-An empty conditional implies comparison value of ©1© (true).
+\CFA condenses simply looping to facilitate coding speed and safety~\see{examples in \VRef[Figure]{f:LoopControlExamples}}.
+
+The \Indexc{for}, \Indexc{while}, and \Indexc{do} loop-control allow an empty conditional, which implies a comparison value of ©1© (true).
 \begin{cfa}
 while ( ®/*empty*/®  )			$\C{// while ( true )}$
@@ -1097,45 +1087,91 @@
 do ... while ( ®/*empty*/®  )	 $\C{// do ... while ( true )}$
 \end{cfa}
-\item
-A comparison N is implicit up-to exclusive range [0,N\R{)}.
+
+The ©for© control has 4 new loop-control operators that are not overloadable:
+\begin{description}[itemsep=0pt,parsep=0pt]
+\item
+\Indexc{\~} (tilde) \Index{up-to exclusive range},
+\item
+\Indexc{\~=} (tilde equal) \Index{up-to inclusive range},
+\item
+\Indexc{-\~} (minus tilde) \Index{down-to exclusive range},
+\item
+\Indexc{-\~=} (minus tilde equal) \Index{down-to inclusive range}.
+\end{description}
+
+The ©for© index components, low (L), high (H), and increment (I), are optional.
+If missing:
+\begin{itemize}[itemsep=0pt,parsep=0pt]
+\item
+\Indexc{0} is the implicit low value.
+\item
+\Indexc{1} is the implicit increment value.
+\item
+The up-to range uses operator \Indexc{+=} for increment.
+\item
+The down-to range uses operator \Indexc{-=} for decrement.
+\end{itemize}
+
+If no type is specified for the loop index, it is the type of the high value H (when the low value is implicit) or the low value L.
+\begin{cfa}
+for ( ®5® )						$\C{// typeof(5) anonymous-index; 5 is high value}$
+for ( i; ®1.5® ~ 5.5 )			$\C{// typeof(1.5) i; 1.5 is low value}$
+for ( ®int i®; 0 ~ 10 ~ 2 )		$\C{// int i; type is explicit}$
+\end{cfa}
+
+The following are examples for constructing different for-control:
+\begin{itemize}[itemsep=0pt]
+\item
+H is implicit up-to exclusive range [0,H\R{)}.
 \begin{cfa}
 for ( ®5® )						$\C{// for ( typeof(5) i; i < 5; i += 1 )}$
 \end{cfa}
 \item
-A comparison ©=© N is implicit up-to inclusive range [0,N\R{]}.
-\begin{cfa}
-for ( ®=®5 )					$\C{// for ( typeof(5) i; i <= 5; i += 1 )}$
-\end{cfa}
-\item
-The up-to range M ©~©\index{~@©~©} N means exclusive range [M,N\R{)}.
-\begin{cfa}
-for ( 1®~®5 )					$\C{// for ( typeof(1) i = 1; i < 5; i += 1 )}$
-\end{cfa}
-\item
-The up-to range M ©~=©\index{~=@©~=©} N means inclusive range [M,N\R{]}.
-\begin{cfa}
-for ( 1®~=®5 )					$\C{// for ( typeof(1) i = 1; i <= 5; i += 1 )}$
-\end{cfa}
-\item
-The down-to range M ©-~©\index{-~@©-~©} N means exclusive range [N,M\R{)}.
-\begin{cfa}
-for ( 1®-~®5 )					$\C{// for ( typeof(1) i = 5; i > 0; i -= 1 )}$
-\end{cfa}
-\item
-The down-to range M ©-~=©\index{-~=@©-~=©} N means inclusive range [N,M\R{]}.
-\begin{cfa}
-for ( 1®-~=®5 )					$\C{// for ( typeof(1) i = 5; i >= 0; i -= 1 )}$
+©~=© H is implicit up-to inclusive range [0,H\R{]}.
+\begin{cfa}
+for ( ®~=® 5 )					$\C{// for ( typeof(5) i; i <= 5; i += 1 )}$
+\end{cfa}
+\item
+L ©~©\index{~@©~©} H is explicit up-to exclusive range [L,H\R{)}.
+\begin{cfa}
+for ( 1 ®~® 5 )					$\C{// for ( typeof(1) i = 1; i < 5; i += 1 )}$
+\end{cfa}
+\item
+L ©~=©\index{~=@©~=©} H is explicit up-to inclusive range [L,H\R{]}.
+\begin{cfa}
+for ( 1 ®~=® 5 )					$\C{// for ( typeof(1) i = 1; i <= 5; i += 1 )}$
+\end{cfa}
+\item
+L ©-~©\index{-~@©-~©} H is explicit down-to exclusive range [H,L\R{)}, where L and H are implicitly interchanged to make the range down-to.
+\begin{cfa}
+for ( 1 ®-~® 5 )					$\C{// for ( typeof(1) i = 5; i > 0; i -= 1 )}$
+\end{cfa}
+\item
+L ©-~=©\index{-~=@©-~=©} H is explicit down-to inclusive range [H,L\R{]}, where L and H are implicitly interchanged to make the range down-to.
+\begin{cfa}
+for ( 1 ®-~=® 5 )					$\C{// for ( typeof(1) i = 5; i >= 0; i -= 1 )}$
 \end{cfa}
 \item
 ©@© means put nothing in this field.
 \begin{cfa}
-for ( 1~®@®~2 )					$\C{// for ( typeof(1) i = 1; /*empty*/; i += 2 )}$
-\end{cfa}
-\item
-©:© means start another index.
-\begin{cfa}
-for ( i; 5 ®:® j; 2~12~3 )		$\C{// for ( typeof(i) i = 1, j = 2; i < 5 \&\& j < 12; i += 1, j += 3 )}\CRT$
+for ( i; 1 ~ ®@® ~ 2 )			$\C{// for ( typeof(1) i = 1; \R{/* empty */}; i += 2 )}$
+for ( i; 1 ~ 10 ~ ®@® )			$\C{// for ( typeof(1) i = 1; i < 10; \R{/* empty */} )}$
+for ( i; 1 ~ ®@® ~ ®@® )		$\C{// for ( typeof(1) i = 1; /*empty*/; \R{/* empty */} )}$
+\end{cfa}
+L cannot be elided for the up-to range, \lstinline{@ ~ 5}, and H for the down-to range, \lstinline{1 -~ @}, because then the loop index is uninitialized.
+Similarly, the high value cannot be elided is an anonymous loop index (©1 ~ @©), as there is no index to stop the loop.
+\item
+©:© means low another index.
+\begin{cfa}
+for ( i; 5 ®:® j; 2 ~ 12 ~ 3 )		$\C{// for ( typeof(i) i = 1, j = 2; i < 5 \&\& j < 12; i += 1, j += 3 )}$
 \end{cfa}
 \end{itemize}
+\R{Warning}: specifying the down-to range maybe unexcepted because the loop control \emph{implicitly} switches the L and H values (and toggles the increment/decrement for I):
+\begin{cfa}
+for ( i; 1 ~ 10 )	${\C[1.5in]{// up range}$
+for ( i; 1 -~ 10 )	${\C{// down range}$
+for ( i; ®10 -~ 1® )	${\C{// \R{WRONG down range!}}\CRT}$
+\end{cfa}
+The reason for this sematics is that the range direction can be toggled by adding/removing the minus, ©'-'©, versus interchanging the L and H expressions, which has a greater chance of introducing errors.
 
 
@@ -4794,5 +4830,5 @@
 	int id;
 	float size;
-	Parts * optionalParts;
+	int * optionalint;
 };
 
@@ -4801,35 +4837,33 @@
 // Subsequent arguments can be specified for initialization
 
-void ?{}(Widget &w) { // default constructor
+void ?{}( Widget & w ) { $\C{// default constructor}$
 	w.id = -1;
 	w.size = 0.0;
-	w.optionalParts = 0;
+	w.optionalint = 0p;
 }
 
 // constructor with values (does not need to include all fields)
-void ?{}(Widget &w, int id, float size) {
+void ?{}( Widget & w, int id, float size ) {
 	w.id = id;
 	w.size = size;
-	w.optionalParts = 0;
-}
-
-// ^? is the destructor operator identifier
-void ^?(Widget &w) { // destructor
+	w.optionalint = 0p;
+}
+
+// ^?{} is the destructor operator identifier
+void ^?{}( Widget & w ) { $\C{// destructor}$
 	w.id = 0;
 	w.size = 0.0;
-	if (w.optionalParts != 0) {
-	// This is the only pointer to optionalParts, free it
-	free(w.optionalParts);
-	w.optionalParts = 0;
+	if ( w.optionalint != 0p ) {
+		free( w.optionalint );
+		w.optionalint = 0p;
 	}
 }
 
-Widget baz; // reserve space only
-Widget foo{}; // calls default constructor
-Widget bar{23, 2.45}; // calls constructor with values
-baz{24, 0.91}; // calls constructor with values
-?{}(baz, 24, 0.91}; // explicit call to constructor
-^bar; // explicit call to destructor
-^?(bar); // explicit call to destructor
+Widget baz; $\C{// reserve space only}$
+Widget foo{}; $\C{// calls default constructor}$
+Widget bar{ 23, 2.45 }; $\C{// calls constructor with values}$
+baz{ 24, 0.91 }; $\C{// calls constructor with values}$
+?{}( baz, 24, 0.91 ); $\C{// explicit call to constructor}$
+^?{} (bar ); $\C{// explicit call to destructor}$
 \end{cfa}
 \caption{Constructors and Destructors}
