-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinterpreter.hs
More file actions
42 lines (36 loc) · 1.06 KB
/
interpreter.hs
File metadata and controls
42 lines (36 loc) · 1.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- Very simple Poly language interpreter written in Haskell
-- Dependency: ghc, stack
-- Usage:
-- Write input in line 39
-- $ make haskell
{-
expr = Const( float val )
| Var ( string name )
| Add ( expr lhs, expr rhs )
| Mul ( expr lhs, expr rhs )
| Let ( string name, expr rhs, expr body )
-}
data Expr
= Const Int
| Add Expr Expr
| Mul Expr Expr
| Var String
| Let String Expr Expr
deriving (Show)
lookupEnv :: String -> [(String, Int)] -> Int
lookupEnv target ((str,val):list)
= if (target == str) then val else lookupEnv target list
lookupEnv target []
= error ("Could not find Val " ++ target)
eval :: Expr -> [(String, Int)] -> Int
eval (Const x) env = x
eval (Add x y) env = (eval x env) + (eval y env)
eval (Mul x y) env = (eval x env) * (eval y env)
eval (Var x) env = lookupEnv x env
eval (Let name value body) env = eval body ((name, (eval value env)):env)
main :: IO ()
main = do
-- Write input here
let input = Let "a" (Const 2) (Add (Var "a") (Const 3))
let output = eval input []
print output