aboutsummaryrefslogtreecommitdiff
path: root/src/Evaluator.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Evaluator.hs')
-rw-r--r--src/Evaluator.hs12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/Evaluator.hs b/src/Evaluator.hs
index 3bc1e09..db56068 100644
--- a/src/Evaluator.hs
+++ b/src/Evaluator.hs
@@ -9,12 +9,13 @@ import Error.Base (LispError (..), LispResult (..),
9 unwrap) 9 unwrap)
10import Operators 10import Operators
11import Text.ParserCombinators.Parsec 11import Text.ParserCombinators.Parsec
12import qualified Data.Map as M
12 13
13apply :: String -> [Expr] -> LispResult Expr 14apply :: String -> [Expr] -> LispResult Expr
14apply fn args = maybe 15apply fn args = maybe
15 (throwError $ UnknownFunction fn) 16 (throwError $ UnknownFunction fn)
16 ($ args) 17 ($ args)
17 (lookup fn primitives) 18 (M.lookup fn primitives)
18 19
19evalUnquoteSplicing :: Env -> Expr -> IOResult Expr 20evalUnquoteSplicing :: Env -> Expr -> IOResult Expr
20evalUnquoteSplicing env (List xs) = List <$> mapM (eval env) xs 21evalUnquoteSplicing env (List xs) = List <$> mapM (eval env) xs
@@ -39,10 +40,8 @@ evalQuasiQuote env literal = return literal -- just behave like quote other
39 40
40eval :: Env -> Expr -> IOResult Expr 41eval :: Env -> Expr -> IOResult Expr
41eval _ v@(StringLiteral s) = return v 42eval _ v@(StringLiteral s) = return v
42eval _ v@(IntLiteral i) = return v 43eval _ v@(Number i) = return v
43eval _ v@(BoolLiteral b) = return v
44eval env (Id l) = getVar env l 44eval env (Id l) = getVar env l
45eval _ v@(FloatLiteral f) = return v
46eval env v@(Vector xs) = Vector <$> mapM (eval env) xs 45eval env v@(Vector xs) = Vector <$> mapM (eval env) xs
47eval env (List[Id "quote", val]) = return val 46eval env (List[Id "quote", val]) = return val
48eval env (List[Id "quasiquote", val]) = evalQuasiQuote env val 47eval env (List[Id "quasiquote", val]) = evalQuasiQuote env val
@@ -50,6 +49,7 @@ eval env v@(List[Id "unquote", val]) = throwError $ BadForm "Cannot use
50eval env v@(List[Id "unquote-splicing", val]) = throwError $ BadForm "Cannot use `unquote-splicing` outside quasiquote form" v 49eval env v@(List[Id "unquote-splicing", val]) = throwError $ BadForm "Cannot use `unquote-splicing` outside quasiquote form" v
51eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . (setVar env var &&& pure) 50eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . (setVar env var &&& pure)
52eval env (List [Id "define", Id var, val]) = eval env val >>= uncurry (*>) . (defineVar env var &&& pure) 51eval env (List [Id "define", Id var, val]) = eval env val >>= uncurry (*>) . (defineVar env var &&& pure)
52-- eval env (List (Id "lambda":List params:body)) = evalLambda params body env
53eval env (List (Id fn : args)) = mapM (eval env) args >>= liftLispResult . apply fn 53eval env (List (Id fn : args)) = mapM (eval env) args >>= liftLispResult . apply fn
54 54
55-- handle bad forms 55-- handle bad forms
@@ -58,3 +58,7 @@ eval env invalidForm = throwError $ BadForm "lisk can't recognize this form" inv
58unwrapList :: Expr -> [Expr] 58unwrapList :: Expr -> [Expr]
59unwrapList (List x) = x 59unwrapList (List x) = x
60unwrapList literal = [literal] 60unwrapList literal = [literal]
61
62-- evalLambda :: [Expr] -> Expr -> Env -> IOResult Expr
63-- evalLambda params body env = do
64-- extendedEnv <- manyBindings env