mirror of
https://github.com/zoriya/HAL.git
synced 2026-06-01 21:35:17 +00:00
Adding cdr
This commit is contained in:
+12
-1
@@ -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**"
|
||||
Reference in New Issue
Block a user