import EnvSimple import Parser import Repl type Symbol = String data Expr = ENum Integer | EId Symbol | EPlus Expr Expr | ETimes Expr Expr | ELet Symbol Expr Expr deriving Show type Environment = Env Integer eval :: Environment -> Expr -> Integer eval env (ENum n) = n eval env (EId id) = lookup_variable env id eval env (EPlus e1 e2) = eval env e1 + eval env e2 eval env (ETimes e1 e2) = eval env e1 * eval env e2 eval env (ELet x e b) = eval (bind_variable env x (eval env e)) b desugar :: PExpr -> Expr desugar (PNum n) = ENum n desugar (PId id) = EId id desugar (PPlus e1 e2) = EPlus (desugar e1) (desugar e2) desugar (PTimes e1 e2) = ETimes (desugar e1) (desugar e2) desugar (PMinus e1 e2) = EPlus (desugar e1) (ETimes (ENum (-1)) (desugar e2)) desugar (PDecl (PLet x _ e) b) = ELet x (desugar e) (desugar b) desugar _ = error "unsupported syntactic construct" run str = ("", show (eval empty_env (desugar (parse str)))) main :: IO () main = repl run Nothing