aboutsummaryrefslogtreecommitdiff
path: root/src/Evaluator.hs
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-10-16 14:24:46 +0100
committerAkshay <[email protected]>2020-10-16 14:24:46 +0100
commitb19a4a35db4cd951c52e179f3340518c9e2dcc1e (patch)
tree6d3d840a995d0467577ca645f5838a16d78aa3d6 /src/Evaluator.hs
parent684e09298b8453ee56571d8a225e11d7c57e3746 (diff)
add initial support for variable definition
Diffstat (limited to 'src/Evaluator.hs')
-rw-r--r--src/Evaluator.hs38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/Evaluator.hs b/src/Evaluator.hs
index 8a5274f..e3bf697 100644
--- a/src/Evaluator.hs
+++ b/src/Evaluator.hs
@@ -1,8 +1,7 @@
1module Evaluator ( 1module Evaluator (eval) where
2 eval
3 ) where
4 2
5import Control.Monad.Except 3import Control.Monad.Except
4import Environment
6import Error.Base (LispError (..), LispResult (..), 5import Error.Base (LispError (..), LispResult (..),
7 unwrap) 6 unwrap)
8import Operators 7import Operators
@@ -15,18 +14,27 @@ apply fn args = maybe
15 ($ args) 14 ($ args)
16 (lookup fn primitives) 15 (lookup fn primitives)
17 16
18eval :: Expr -> LispResult Expr 17eval :: Env -> Expr -> IOResult Expr
19eval v@(StringLiteral s) = return v 18eval _ v@(StringLiteral s) = return v
20eval v@(IntLiteral i) = return v 19eval _ v@(IntLiteral i) = return v
21eval v@(BoolLiteral b) = return v 20eval _ v@(BoolLiteral b) = return v
22eval v@(FloatLiteral f) = return v 21eval env (Id l) = getVar env l
23eval v@(Vector xs) = liftM Vector $ mapM eval xs 22eval _ v@(FloatLiteral f) = return v
24-- handle quotes as literals 23eval env v@(Vector xs) = liftM Vector $ mapM (eval env) xs
25eval (List[Id "quote", val]) = return val 24eval env (List[Id "quote", val]) = return val
26eval (List[Id "quasiquote", val]) = undefined 25eval env (List[Id "quasiquote", val]) = undefined
27eval (List[Id "unquote", val]) = undefined 26eval env (List[Id "unquote", val]) = eval env val
28eval (List (Id fn : args)) = mapM eval args >>= apply fn 27eval env (List [Id "set!", Id var, val]) = do
28 e <- eval env val
29 setVar env var e
30 return e
31eval env (List [Id "define", Id var, val]) = do
32 e <- eval env val
33 defineVar env var e
34 return e
35eval env (List (Id fn : args)) = mapM (eval env) args >>= liftLispResult . apply fn
36eval env NoReturn = throwError $ BadForm "Invalid usage of non-returning expression" NoReturn
29 37
30-- handle bad forms 38-- handle bad forms
31eval invalidForm = throwError $ BadForm "lisk can't recognize this form" invalidForm 39eval env invalidForm = throwError $ BadForm "lisk can't recognize this form" invalidForm
32 40