From 032e26cf9ed236889637e02e56aef7c22721cd23 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 17 Oct 2020 09:27:40 +0530 Subject: prefer applicative over monadic style --- src/Evaluator.hs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/Evaluator.hs') diff --git a/src/Evaluator.hs b/src/Evaluator.hs index 1cc9edd..3d3be02 100644 --- a/src/Evaluator.hs +++ b/src/Evaluator.hs @@ -19,9 +19,9 @@ apply fn args = maybe evalUnquote :: Env -> Expr -> IOResult Expr evalUnquote env (List [Id "unquote", vs]) = eval env vs evalUnquote env (List [Id "quote", vs]) = - liftM (List . ([Id "quote"] ++ ) . (: [])) (evalUnquote env vs) -evalUnquote env (List vs) = liftM List $ mapM (evalUnquote env) vs -evalUnquote env (Vector vs) = liftM Vector $ mapM (evalUnquote env) vs + fmap (List . ([Id "quote"] ++ ) . (: [])) (evalUnquote env vs) +evalUnquote env (List vs) = List <$> mapM (evalUnquote env) vs +evalUnquote env (Vector vs) = Vector <$> mapM (evalUnquote env) vs evalUnquote env literal = return literal evalQuasiQuote :: Env -> Expr -> IOResult Expr @@ -35,12 +35,12 @@ eval _ v@(IntLiteral i) = return v eval _ v@(BoolLiteral b) = return v eval env (Id l) = getVar env l eval _ v@(FloatLiteral f) = return v -eval env v@(Vector xs) = liftM Vector $ mapM (eval env) xs +eval env v@(Vector xs) = Vector <$> mapM (eval env) xs eval env (List[Id "quote", val]) = return val eval env (List[Id "quasiquote", val]) = evalQuasiQuote env val -eval env v@(List[Id "unquote", val]) = throwError $ BadForm "Cannot use `unquote` form outside quasiquote context" v -eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . ((setVar env var) &&& pure) -eval env (List [Id "define", Id var, val]) = eval env val >>= uncurry (*>) . ((defineVar env var) &&& pure) +eval env v@(List[Id "unquote", val]) = throwError $ BadForm "Cannot use `unquote` outside quasiquote form" v +eval env (List [Id "set!", Id var, val]) = eval env val >>= uncurry (*>) . (setVar env var &&& pure) +eval env (List [Id "define", Id var, val]) = eval env val >>= uncurry (*>) . (defineVar env var &&& pure) eval env (List (Id fn : args)) = mapM (eval env) args >>= liftLispResult . apply fn eval env NoReturn = throwError $ BadForm "Invalid usage of non-returning expression" NoReturn -- cgit v1.2.3