mirror of
https://github.com/zoriya/HAL.git
synced 2026-06-02 05:45:08 +00:00
Implementing car
This commit is contained in:
+12
-1
@@ -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**"
|
||||
Reference in New Issue
Block a user