aboutsummaryrefslogtreecommitdiff
path: root/ast/CC/AST
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2020-07-25 21:51:37 +0200
committerTom Smeding <tom.smeding@gmail.com>2020-07-25 21:51:37 +0200
commit0503dcb2998ab9dcd0f39e6f264f482a3d2cc7f7 (patch)
treedeb942a011451b183a1028a2f0f891d9e09e5107 /ast/CC/AST
parentd5ab8f4939a4af51c7a9e1c2cd73c8352f8345b4 (diff)
Support Let
Diffstat (limited to 'ast/CC/AST')
-rw-r--r--ast/CC/AST/Source.hs2
-rw-r--r--ast/CC/AST/Typed.hs8
2 files changed, 10 insertions, 0 deletions
diff --git a/ast/CC/AST/Source.hs b/ast/CC/AST/Source.hs
index 11b7bc6..e648759 100644
--- a/ast/CC/AST/Source.hs
+++ b/ast/CC/AST/Source.hs
@@ -27,6 +27,7 @@ data Type = TFun Type Type
deriving (Show, Read)
data Expr = Lam SourceRange [(Name, SourceRange)] Expr
+ | Let SourceRange (Name, SourceRange) Expr Expr
| Call SourceRange Expr Expr
| Int SourceRange Int
| Tup SourceRange [Expr]
@@ -43,6 +44,7 @@ instance Pretty Type where
instance HasRange Expr where
range (Lam sr _ _) = sr
+ range (Let sr _ _ _) = sr
range (Call sr _ _) = sr
range (Int sr _) = sr
range (Tup sr _) = sr
diff --git a/ast/CC/AST/Typed.hs b/ast/CC/AST/Typed.hs
index 26f7b5c..b12b30a 100644
--- a/ast/CC/AST/Typed.hs
+++ b/ast/CC/AST/Typed.hs
@@ -25,6 +25,7 @@ data TypeScheme = TypeScheme [Int] Type
deriving (Show, Read)
data Expr = Lam Type Occ Expr
+ | Let Occ Expr Expr
| Call Type Expr Expr
| Int Int
| Tup [Expr]
@@ -36,6 +37,7 @@ data Occ = Occ Name Type
exprType :: Expr -> Type
exprType (Lam typ _ _) = typ
+exprType (Let _ _ body) = exprType body
exprType (Call typ _ _) = typ
exprType (Int _) = TInt
exprType (Tup es) = TTup (map exprType es)
@@ -60,6 +62,12 @@ instance Pretty Expr where
precParens p 2 $
"(\\(" ++ n ++ " :: " ++ pretty t ++ ") -> "
++ prettyPrec 2 e ++ ") :: " ++ pretty ty
+ prettyPrec p (Let (Occ n t) rhs e) =
+ precParens p 2 $
+ "let (" ++ n ++ " :: " ++ pretty t ++ ") = " ++ pretty rhs ++ " " ++
+ (case e of
+ Let _ _ _ -> pretty e
+ _ -> "in " ++ pretty e)
prettyPrec p (Call ty e1 e2) =
precParens p 2 $
prettyPrec 3 e1 ++ " " ++ prettyPrec 3 e2 ++ " :: " ++ pretty ty