Adding cdr

This commit is contained in:
Zoe Roux
2021-11-04 14:47:08 +01:00
parent f5731c93e9
commit 67359c3e8f
+12 -1
View File
@@ -19,6 +19,7 @@ evalS :: SExpr -> LispEnv -> Either String (Atom, LispEnv)
evalS (SExpr ((Atom (ASymbol "define")):xs)) env = evalDefine xs env
evalS (SExpr ((Atom (ASymbol "cons")):xs)) env = evalCons xs env
evalS (SExpr ((Atom (ASymbol "car")):xs)) env = evalCar xs env
evalS (SExpr ((Atom (ASymbol "cdr")):xs)) env = evalCdr xs env
evalS expr _ = Left $ "**Error: couldn't evaluate " ++ show expr ++ "**"
evalDefine :: [Statement] -> LispEnv -> Either String (Atom, LispEnv)
@@ -43,4 +44,14 @@ evalCar [Expr expr] env = do
(ACons f _) -> return (f, nEnv)
atom -> Left $ "**Error: " ++ show atom ++ " is not a pair.**"
evalCar [Atom bad] _ = Left $ "**Error: " ++ show bad ++ " is not a pair.**"
evalCar _ _ = Left "**Error: incorect argument count in car**"
evalCar _ _ = Left "**Error: incorect argument count in car**"
evalCdr :: [Statement] -> LispEnv -> Either String (Atom, LispEnv)
evalCdr [Atom (ACons _ s)] env = Right (s, env)
evalCdr [Expr expr] env = do
(atom, nEnv) <- evalS expr env
case atom of
(ACons _ s) -> return (s, nEnv)
atom -> Left $ "**Error: " ++ show atom ++ " is not a pair.**"
evalCdr [Atom bad] _ = Left $ "**Error: " ++ show bad ++ " is not a pair.**"
evalCdr _ _ = Left "**Error: incorect argument count in cdr**"