Implementing car

This commit is contained in:
Zoe Roux
2021-11-04 14:45:15 +01:00
parent 27fc7d68b7
commit f5731c93e9
+12 -1
View File
@@ -18,6 +18,7 @@ getSymbolValue _ [] = Nothing
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 expr _ = Left $ "**Error: couldn't evaluate " ++ show expr ++ "**"
evalDefine :: [Statement] -> LispEnv -> Either String (Atom, LispEnv)
@@ -32,4 +33,14 @@ evalCons [first, second] env = do
(fAtom, fEnv) <- eval first env
(sAtom, sEnv) <- eval second fEnv
return (ACons fAtom sAtom, sEnv)
evalCons args _ = Left $ "**Error: cons expect 2 arguments. " ++ show (length args) ++ " where found.**"
evalCons args _ = Left $ "**Error: cons expect 2 arguments. " ++ show (length args) ++ " where found.**"
evalCar :: [Statement] -> LispEnv -> Either String (Atom, LispEnv)
evalCar [Atom (ACons f _)] env = Right (f, env)
evalCar [Expr expr] env = do
(atom, nEnv) <- evalS expr env
case atom of
(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**"