diff options
Diffstat (limited to 'src/Evaluator.hs')
-rw-r--r-- | src/Evaluator.hs | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/Evaluator.hs b/src/Evaluator.hs index c8d8d34..10e5e58 100644 --- a/src/Evaluator.hs +++ b/src/Evaluator.hs | |||
@@ -10,10 +10,10 @@ import Parser | |||
10 | import Text.ParserCombinators.Parsec | 10 | import Text.ParserCombinators.Parsec |
11 | 11 | ||
12 | apply :: String -> [Expr] -> LispResult Expr | 12 | apply :: String -> [Expr] -> LispResult Expr |
13 | apply fn args = | 13 | apply fn args = maybe |
14 | case lookup fn primitives of | 14 | (throwError $ UnknownFunction fn) |
15 | Just f -> f args | 15 | ($ args) |
16 | _ -> throwError $ UnknownFunction fn | 16 | (lookup fn primitives) |
17 | 17 | ||
18 | eval :: Expr -> LispResult Expr | 18 | eval :: Expr -> LispResult Expr |
19 | eval v@(StringLiteral s) = return v | 19 | eval v@(StringLiteral s) = return v |
@@ -21,9 +21,11 @@ eval v@(IntLiteral i) = return v | |||
21 | eval v@(BoolLiteral b) = return v | 21 | eval v@(BoolLiteral b) = return v |
22 | eval v@(FloatLiteral f) = return v | 22 | eval v@(FloatLiteral f) = return v |
23 | -- handle quotes as literals | 23 | -- handle quotes as literals |
24 | eval (List[Id "quote", val]) = return val | 24 | eval (List[Id "quote", val]) = return val |
25 | eval (List (Id fn : args)) = mapM eval args >>= apply fn | 25 | eval (List[Id "quasiquote", val]) = undefined |
26 | eval (List[Id "unquote", val]) = undefined | ||
27 | eval (List (Id fn : args)) = mapM eval args >>= apply fn | ||
26 | 28 | ||
27 | -- handle bad forms | 29 | -- handle bad forms |
28 | eval idk = throwError $ BadForm "lisk can't recognize this form" idk | 30 | eval invalidForm = throwError $ BadForm "lisk can't recognize this form" invalidForm |
29 | 31 | ||