diff --git a/src/Evaluator.hs b/src/Evaluator.hs index d0b289f..aa92784 100644 --- a/src/Evaluator.hs +++ b/src/Evaluator.hs @@ -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.**" \ No newline at end of file +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**" \ No newline at end of file