ref: ea5764bbd269195ac3b48433a151c23444924c5b
parent: 3b8e0aad66dc7b51b98324fefafce6e0d85fa8e6
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Sun Oct 22 15:21:13 EDT 2023
Better pretty printing.
--- a/src/MicroHs/Exp.hs
+++ b/src/MicroHs/Exp.hs
@@ -12,11 +12,12 @@
app2, cCons, cNil, cFlip,
allVarsExp, freeVars,
) where
-import Prelude
+import Prelude --Xhiding((<>))
import Data.Char
import Data.List
import MicroHs.Ident
import MicroHs.Expr(Lit(..), showLit, eqLit)
+import Text.PrettyPrint.HughesPJ
--Ximport Control.DeepSeq
--Ximport Compat
--Yimport Primitives(NFData(..))
@@ -52,6 +53,9 @@
| Lit Lit
--Xderiving (Show, Eq)
+--pattern Let :: Ident -> Exp -> Exp -> Exp
+--pattern Let i e b = App (Lam i b) e
+
--Winstance NFData Exp where rnf (Var i) = rnf i; rnf (App f a) = rnf f `seq` rnf a; rnf (Lam i e) = rnf i `seq` rnf e; rnf (Lit l) = rnf l
eqExp :: Exp -> Exp -> Bool
@@ -174,12 +178,12 @@
quoteString :: String -> String
quoteString s =
let
- char c =
+ achar c =
if eqChar c '"' || eqChar c '\\' || ltChar c ' ' || ltChar '~' c then
'\\' : showInt (ord c) ++ ['&']
else
[c]
- in '"' : concatMap char s ++ ['"']
+ in '"' : concatMap achar s ++ ['"']
encodeString :: String -> Exp
encodeString [] = cNil
@@ -435,12 +439,16 @@
-}
showExp :: Exp -> String
-showExp ae =
+showExp = render . ppExp
+
+ppExp :: Exp -> Doc
+ppExp ae =
case ae of
- Var i -> showIdent i
- App f a -> "(" ++ showExp f ++ " " ++ showExp a ++ ")"- Lam i e -> "(\\" ++ showIdent i ++ ". " ++ showExp e ++ ")"
- Lit l -> showLit l
+-- Let i e b -> sep [ text "let" <+> ppIdent i <+> text "=" <+> ppExp e, text "in" <+> ppExp b ]
+ Var i -> ppIdent i
+ App f a -> parens $ ppExp f <+> ppExp a
+ Lam i e -> parens $ text "\\" <> ppIdent i <> text "." <+> ppExp e
+ Lit l -> text (showLit l)
substExp :: Ident -> Exp -> Exp -> Exp
substExp si se ae =
--
⑨