diff options
author | Akshay <[email protected]> | 2020-11-12 05:54:46 +0000 |
---|---|---|
committer | Akshay <[email protected]> | 2020-11-12 05:54:46 +0000 |
commit | 841e23f1f5036748e3d179e3f96eedd5bcfdb555 (patch) | |
tree | 88408ffaa869aae221586711f9c89c34859e7cb2 /src/Evaluator.hs | |
parent | 29d8f8ea04ca651616b4bdd8d3a61da9f0cfae29 (diff) |
Diffstat (limited to 'src/Evaluator.hs')
-rw-r--r-- | src/Evaluator.hs | 12 |
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) |
10 | import Operators | 10 | import Operators |
11 | import Text.ParserCombinators.Parsec | 11 | import Text.ParserCombinators.Parsec |
12 | import qualified Data.Map as M | ||
12 | 13 | ||
13 | apply :: String -> [Expr] -> LispResult Expr | 14 | apply :: String -> [Expr] -> LispResult Expr |
14 | apply fn args = maybe | 15 | apply 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 | ||
19 | evalUnquoteSplicing :: Env -> Expr -> IOResult Expr | 20 | evalUnquoteSplicing :: Env -> Expr -> IOResult Expr |
20 | evalUnquoteSplicing env (List xs) = List <$> mapM (eval env) xs | 21 | evalUnquoteSplicing env (List xs) = List <$> mapM (eval env) xs |
@@ -39,10 +40,8 @@ evalQuasiQuote env literal = return literal -- just behave like quote other | |||
39 | 40 | ||
40 | eval :: Env -> Expr -> IOResult Expr | 41 | eval :: Env -> Expr -> IOResult Expr |
41 | eval _ v@(StringLiteral s) = return v | 42 | eval _ v@(StringLiteral s) = return v |
42 | eval _ v@(IntLiteral i) = return v | 43 | eval _ v@(Number i) = return v |
43 | eval _ v@(BoolLiteral b) = return v | ||
44 | eval env (Id l) = getVar env l | 44 | eval env (Id l) = getVar env l |
45 | eval _ v@(FloatLiteral f) = return v | ||
46 | eval env v@(Vector xs) = Vector <$> mapM (eval env) xs | 45 | eval env v@(Vector xs) = Vector <$> mapM (eval env) xs |
47 | eval env (List[Id "quote", val]) = return val | 46 | eval env (List[Id "quote", val]) = return val |
48 | eval env (List[Id "quasiquote", val]) = evalQuasiQuote env val | 47 | eval env (List[Id "quasiquote", val]) = evalQuasiQuote env val |
@@ -50,6 +49,7 @@ eval env v@(List[Id "unquote", val]) = throwError $ BadForm "Cannot use | |||
50 | eval env v@(List[Id "unquote-splicing", val]) = throwError $ BadForm "Cannot use `unquote-splicing` outside quasiquote form" v | 49 | eval env v@(List[Id "unquote-splicing", val]) = throwError $ BadForm "Cannot use `unquote-splicing` outside quasiquote form" v |
51 | eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . (setVar env var &&& pure) | 50 | eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . (setVar env var &&& pure) |
52 | eval env (List [Id "define", Id var, val]) = eval env val >>= uncurry (*>) . (defineVar env var &&& pure) | 51 | eval 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 | ||
53 | eval env (List (Id fn : args)) = mapM (eval env) args >>= liftLispResult . apply fn | 53 | eval 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 | |||
58 | unwrapList :: Expr -> [Expr] | 58 | unwrapList :: Expr -> [Expr] |
59 | unwrapList (List x) = x | 59 | unwrapList (List x) = x |
60 | unwrapList literal = [literal] | 60 | unwrapList literal = [literal] |
61 | |||
62 | -- evalLambda :: [Expr] -> Expr -> Env -> IOResult Expr | ||
63 | -- evalLambda params body env = do | ||
64 | -- extendedEnv <- manyBindings env | ||