From c2cafd4be71ae66aa17c9f647faf8d6043b1d681 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 9 Nov 2021 15:41:18 +0100 Subject: [PATCH] Re-evaluating builtins --- src/Evaluator.hs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Evaluator.hs b/src/Evaluator.hs index 3308500..bf05e60 100644 --- a/src/Evaluator.hs +++ b/src/Evaluator.hs @@ -1,6 +1,5 @@ module Evaluator where import Expressions -import Expressions (Atom(AProcedure)) eval :: Statement -> LispEnv -> Either String (Atom, LispEnv) eval (Expr expr) env = evalS expr env @@ -27,7 +26,7 @@ evalS (SExpr ((Atom (ASymbol "cond")):xs)) env = evalCond xs env evalS (SExpr ((Atom (AProcedure n dArgs body)):args)) env = do localEnv <- setupLocalVars dArgs args env evalS body localEnv -evalS (SExpr ((Atom (ABuiltin n func)):args)) env = func (eval <$> args) env +evalS (SExpr ((Atom (ABuiltin n func)):args)) env = evalBuiltin func args env evalS (SExpr ((Atom (ASymbol name)):xs)) env = evalSymbol name xs env evalS (SExpr (Expr nested:args)) env = do (atom, nEnv) <- evalS nested env @@ -45,6 +44,19 @@ evalSymbol name args env = (Just atom) -> Left $ "**Error: " ++ show atom ++ " is not a procedure.**" Nothing -> Left $ "**Error: Variable not bound " ++ name ++ "**" +evalBuiltin :: ProcedureFunc -> [Statement] -> LispEnv -> Either String (Atom, LispEnv) +evalBuiltin func args env = do + (nArgs, nEnv) <- evalArgs args env + func nArgs nEnv + where + evalArgs :: [Statement] -> LispEnv -> Either String ([Atom], LispEnv) + evalArgs (x:xs) env = do + (first, nEnv) <- eval x env + (lo, lEnv) <- evalArgs xs nEnv + return (first:lo, lEnv) + evalArgs [] env = pure ([], env) + + showType :: Atom -> String showType (AQuote v) = "(Quote" ++ show v ++ ")" showType (AString v) = "(String " ++ v ++ ")"