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 "";
