
type 3tail (>indent,  >type 1, " ">, 
	nlcr+indent+"(TypPwr "+type 1+" "+expr+")">):
   power symbol, ->, expr 6(>indent+" ", expr>);
type 3tail (>indent,  >type 1, " ">, nlcr+indent+"(TypStar "+type 1+")">):
   star symbol, ->;
type 3tail (>indent, >type 1, "">, type 1>):.

%TEX
\subsection{ ? and ! types }
%
type 4 (>indent, RESTRICT>,  ALL>,
       nlcr+indent+"(TypIn "+in type+")">):
   question mark symbol, ->,
      type 5 (>indent+" ", RESTRICT>,  RESTRICT>, in type>);
type 4 (>indent, RESTRICT>,  ALL>, nlcr+indent+"(TypOut "+out type+")">):
   exclamation mark symbol, ->,
      type 5 (>indent+" ", RESTRICT>,  RESTRICT>, out type>);
type 4 (>indent, x>,  z>, type>):
   type 5 (>indent, x>,  z>, type>).

%TEX
\subsection{ elementary types }
%
type 5 (>indent, x>,  z>, type>):
   open symbol, ->, type 0 (>indent, x>,  z>, type>),
      close symbol;
type 5 (>indent, RESTRICT>,  RESTRICT>, nlcr+indent+"(TypSym "+name+")">):
   name (name>), ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypAppset)">):
   appset symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypBind "+name+")">):
   int symbol, reversed element of symbol, ->, name (name>);
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypInt)">):
   int symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypFlo)">):
   float symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypBool)">):
   bool symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypString)">):
   string symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypProd [])">):
   empty type  symbol, ->;
type 5 (>indent, RESTRICT>, RESTRICT>, nlcr+indent+"(TypNon (TypProd []))">):
    get org (org>),
   "[]", layout,  type out (>"glassp:"+org+ " warning: [] should be [<>]\n"). 


%TEX
\subsection{ right hand sides }
%
rhs (>indent, expr>):
   expression (>indent, expr>), ->;
rhs (>indent, apps>):
   appset (>indent, apps>).

%TEX
\subsection {where clauses}
%
may be where (>indent, >rhs, " ">,
	nlcr+indent+"(VWhere "+
	nlcr+indent+" ["+local defs+"]"+rhs+")">):
   where symbol, ->, local defs (>indent+"  ", local defs>), end where symbol;
may be where (>indent, >rhs, "">, rhs>):.

local defs (>indent, local def+local defs>):
   local def (>indent, local def>),
      more local defs (>indent, local defs>).

more local defs (>indent, ","+local defs>):
   semicolons,
      local defs (>indent, local defs>), ->;
more local defs (>indent, "">):
   opt semicolons.

local def (>indent,
	nlcr+indent+"(DefCon "+ org + tuple+expr+")">):
   name tuple (>indent+" ", tuple>), equals symbol, ->,
     get org (org>),
      expression (>indent+" ", expr>);
local def (>indent, def>): 
   glass text element (>indent, def>).

%TEX
 \subsection {appsets}
%
appset (>indent, expr>):
   left brace symbol,  apselts (>indent+"  ", apselts>),
      right brace symbol,
      where (> nlcr+indent+"(VAppset "+ nlcr+indent+" ["+apselts+"])", appset>),
      may be where (>indent, >appset, extra indent>, expr>), ->;
appset (>indent, cond>):
  expr 0 (>indent,expr 0>),
   arrow symbol,
      appset (>indent+" ", appset t>), semicolons,
      expression  (>indent+"   ", appset e>), 
      make op node 3 (>indent, >"->", >expr 0, >appset t, >appset e, cond>).

apselts (>indent, apselt+apselts>):
   apselt (>indent, apselt>), ->,
      more apselts (>indent, apselts>);
apselts (>indent, "">):.

more apselts (>indent, ","+apselt+apselts>):
   comma symbol, ->,
     apselt (>indent, apselt>), 
       more apselts (>indent, apselts>);
more apselts (>indent, "">):.

apselt (>indent, apselt>):
   expr 0 (>indent+extra indent, expr>), ->,
      apselt tail (>indent, >expr, extra indent>, apselt>);
apselt (>indent, apselt>):
   apselt 1 (>indent, apselt>).
