
formal macro param tail (>indent, >fp1, " ">,
	nlcr+indent+"(FpComp "+fp1+fptail+")">):
   colon symbol, ->, formal macro param (>indent+" ", fptail>);
formal macro param tail (>indent, >fp1, "">, fp1>):.

%TEX
\subsection{ literal patterns }
%
formal macro param1 (>indent, nlcr+indent+"(FpName "+name+")">):
   name (name>), ->;
formal macro param1 (>indent, nlcr+indent+numb>):
   integer or floating denotation (>"Fp",numb>), ->;
formal macro param1 (>indent, nlcr+indent+"(FpBool "+val+")">):
   boolean denotation (val>), ->;
formal macro param1 (>indent, nlcr+indent+"(FpStr "+str+")">):
   string denotation (str>), ->;
formal macro param1 (>indent,
	nlcr+indent+"(FpList "+#
	nlcr+indent+" ["+fps+"])">):
   left square bracket symbol, ->, formal macro params (>indent+"  ", fps>),
      right square bracket symbol;
formal macro param1 (>indent, fp>):
   open symbol,  formal macro param (>indent, fp>),
      close symbol.

%TEX
\subsection{types}
Certain types are restricted to certain contexts.            

These restrictions will be imposed by means of three inherited 
affixes, of which the first will be {\sc restrict} if a type for 
wire tuples is expected,
and of which the second indicates that no $?$ or $!$ may be used.

In all other cases, these affixes will contain {\sc all}.         
%

ALL :: "1".
RESTRICT :: empty.

type (>indent, nlcr+indent+"(TypLocal ["+names+"]"+type+")">):
   left brace symbol, ->, names (names>),
      right brace symbol, 
      type 0 (>indent+" ", all>, RESTRICT>, type>);
type (>indent, type>):
   type 0 (>indent, all>, RESTRICT>, type>).

%TEX
\subsection{ function types }
%
type 0 (>indent, xx>, z>, type>):
   type 1 (>indent+extra indent, x>, z>, type 1>),
      type 0tail (>indent, >x, >z, >type 1,  extra indent>, xx>,type>).

type 0tail (>indent, >all, >RESTRICT,>funpar, " ">, ALL>,
	nlcr+indent+"(TypFun "+funpar+funres+")">):
   arrow symbol, ->,
      type 0 (>indent+" ", All>, RESTRICT>, funres>);
type 0tail (>indent, >x, >z, >type, "">, x>, type>):.

%TEX
\subsection{ directional types and adirectional types }
%
type 1 (>indent, ALL>, RESTRICT>, nlcr+indent+"(TypNon "+typnon+")">):
   left square bracket symbol,
      type 2 (>indent+" ", RESTRICT>, all>, typnon>),
      right square bracket symbol, ->;
type 1 (>indent, xx>, z>, type>):
   type 2 (>indent+extra indent, x>, z>, type 1>),
      type 1tail (>indent, >x, >z, >type 1,  extra indent>, xx>,type>).

type 1tail (>indent, >RESTRICT, >RESTRICT,>in type, " ">, ALL>,
	nlcr+indent+"(TypUni "+in type+out type+")">):
   fat arrow symbol, ->,
      type 2 (>indent+" ", RESTRICT>, RESTRICT>, out type>);
type 1tail (>indent, >x, >z, >type, "">, x>, type>):.

%TEX
\subsection { type products }
%
type 2 (>indent, x>,  z>, type>):
   type 3 (>indent+extra indent, x>, z>, type1>),
      type 2tail (>indent, >type1, extra indent>, type>).

restrict (>RESTRICT,>r,RESTRICT>): ->;
restrict (>r,>RESTRICT,RESTRICT>): ->;
restrict (>r,>rr,ALL>):.

type 2tail (>indent, >type1, "  ">,
	nlcr+indent+"(TypProd "+#
	nlcr+indent+" ["+type1+", "+types+"])">):
   ampersand symbol, ->,
      type 2rest tail (>indent+"  ", types>);
type 2tail (>indent, >type, "">, type>):.

type 2rest tail (>indent, type+types>):
   type3 (>indent, x>, z>, type>),
      more type 2rest tail (>indent, types>).

more type 2rest tail (>indent, ", "+types>):
   ampersand symbol, ->, type 2rest tail (>indent,  types>);
more type 2rest tail (>indent, "">):.

%TEX
\subsection{ power types (finite and infinite ones)}
%
type 3 (>indent, x>,  z>, type>):
   type 4 (>indent+extra indent, x>, z>, type 1>),
      type 3tail (>indent,  >type 1, extra indent>, type>).
