BEGIN
op: ATOM = NARROW[lst.first];
arg1: LIST OF Se = lst.rest;
arg2: LIST OF Se = lst.rest.rest;
opProps: REF Props = GetAtomProps[op, table].rp;
type: UnparseType ← opProps.unparseType;
SELECT TRUE FROM
type = infixA AND arg2 # NIL
=> {Str.Begin[stream];
Unp[arg1, NIL, 0];
stream.PutChar[' ];
Str.Bp[stream, TRUE, 0];
Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg2, NIL, opn];
Str.End[stream]};
type = infixC AND arg2 # NIL
=> {IF uncle = NIL OR op # uncle.first THEN Str.Begin[stream];
Unp[arg1, NIL, 0];
Unp[lst, NIL, 0];
Str.Bp[stream, FALSE, -1];
stream.PutChar[' ];
Unp[arg2, lst, opn];
IF uncle = NIL OR op # uncle.first THEN Str.End[stream]};
type = matchB AND arg2 = NIL
=> {Unp[lst, NIL, 0];
Unp[arg1, NIL, opn - 1];
IF opn <= 0 THEN stream.Put[IO.atom[opProps.closer]]};
type = matchB AND arg2 # NIL
=> {Str.Begin[stream];
Unp[arg1, NIL, 0];
Str.Bp[stream, TRUE, - 1 - Length[Atom.GetPName [op]]];
Unp[lst, NIL, 0];
Unp[arg2, NIL, opn - 1];
IF opn <= 0 THEN stream.Put[IO.atom[opProps.closer]];
Str.End[stream]};
type = infixD AND arg2 # NIL
=> {IF uncle = NIL OR op # uncle.first THEN Str.Begin[stream];
Unp[arg1, NIL, 0];
Str.Bp[stream, TRUE, - 1 - Length[Atom.GetPName [op]]];
Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg2, lst, opn];
IF uncle = NIL OR op # uncle.first THEN Str.End[stream]};
type = infixE AND arg2 # NIL
=> {Str.Begin[stream];
Unp[arg1, NIL, 0];
stream.PutChar[' ];
Unp[lst, NIL, 0];
stream.PutChar[' ];
Str.Bp[stream, FALSE, 0];
Unp[arg2, lst, opn];
Str.End[stream]};
opProps.infix AND arg2 # NIL
=> {IF uncle = NIL OR op # uncle.first THEN Str.Begin[stream];
Unp[arg1, NIL, 0];
Str.Bp[stream, TRUE, - 2 - Length[Atom.GetPName [op]]];
stream.PutChar[' ];
Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg2, lst, opn];
IF uncle = NIL OR op # uncle.first THEN Str.End[stream]};
opProps.matchfix AND arg2 = NIL
=> {Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg1, NIL, opn - 1];
IF opn <= 0 THEN
{stream.PutChar[' ]; stream.Put[IO.atom[opProps.closer]]}};
opProps.prefix AND arg2 = NIL
=> {Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg1, NIL, opn]};
opProps.postfix AND arg2 = NIL
=> {Unp[arg1, NIL, opn];
stream.PutChar[' ];
Unp[lst, NIL, 0]};
opProps.subfix AND arg2 # NIL
=> {Str.Begin[stream];
Unp[arg1, NIL, 0];
stream.PutChar[' ];
Str.Bp[stream, TRUE, - 2 - Length[Atom.GetPName [op]]];
Unp[lst, NIL, 0];
stream.PutChar[' ];
Unp[arg2, NIL, opn - 1];
stream.PutChar[' ];
IF opn <= 0 THEN stream.Put[IO.atom[opProps.closer]];
Str.End[stream]};
opProps.busfix AND arg2 # NIL
=> {Unp[lst, NIL, 0];
Str.Begin[stream];
stream.PutChar[' ];
Unp[arg1, NIL, 0];
stream.PutChar[' ];
Str.Bp[stream, TRUE, - Length[Atom.GetPName [opProps.closer]]];
stream.Put[IO.atom[opProps.closer]];
stream.PutChar[' ];
Unp[arg2, NIL, opn];
Str.End[stream]};
ENDCASE => ERROR Error