pprMain x = nil <> ppr 0 R x <> nil; ident = re "[a-z][A-Za-z0-9']*#let#in"; number = re "[0-9]+|0x[0-9a-fA-F]+"; ppr i d x = manyParens (ppr' i d x); ppr' i d (ExVar _ x) = text (x @@ ident); ppr' i d (ExInt _ x) = text (bij i2a x @@ number); ppr' i d (ExLet _ x e1 e2) = parensIf (d == L) $ group $ text "let" <> nil <> text (x @@ ident) <> nil <> text "=" <> space' <> ppr 0 R e1 <> line <> text "in" <> space <> nest 3 (ppr 0 R e2); ppr' i d (ExSub _ e1 e2) = parensIf (i >= 1) $ group $ ppr 0 L e1 <> line' <> text "-" <> space' <> ppr 1 R e2; parensIf b d = if b then parens d else d ; manyParens d = d <+ parens (manyParens d); parens d = text "(" <> nest 1 (nil <> d <> nil) <> text ")"; space = (text " " <+ charOf (spaceChars `butnot` char ' ')) <> nil; nil = text "" <+ (charOf spaceChars <> nil); line' = line <+ text "" ; space' = space <+ text "";