From de5e375bd159508a2d0ddff55a58fe30164ff279 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 8 Nov 2021 16:33:41 +0100 Subject: [PATCH] Adding a + --- hal.cabal | 1 + src/LispEnv.hs | 3 ++- src/Maths.hs | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/Maths.hs diff --git a/hal.cabal b/hal.cabal index 1ac03cd..f336bf4 100644 --- a/hal.cabal +++ b/hal.cabal @@ -30,6 +30,7 @@ library Expressions LispEnv LispParser + Maths other-modules: Paths_hal hs-source-dirs: diff --git a/src/LispEnv.hs b/src/LispEnv.hs index 60387e0..1a8675d 100644 --- a/src/LispEnv.hs +++ b/src/LispEnv.hs @@ -1,6 +1,7 @@ module LispEnv where import Expressions import Evaluator +import Maths defaultEnv :: LispEnv @@ -11,7 +12,7 @@ defaultEnv = [ ("eq?", ABuiltin "eq?" evalEq), ("atom?", ABuiltin "atom?" evalAtom), ("cond", ABuiltin "cond" evalCond) - ] + ] ++ mathEnv evalCons :: [Statement] -> LispEnv -> Either String (Atom, LispEnv) evalCons [first, second] env = do diff --git a/src/Maths.hs b/src/Maths.hs new file mode 100644 index 0000000..169d686 --- /dev/null +++ b/src/Maths.hs @@ -0,0 +1,20 @@ +module Maths where +import Expressions +import Evaluator + +mathEnv :: LispEnv +mathEnv = [ + ("+", ABuiltin "+" evalPlus) + ] + +evalPlus :: [Statement] -> LispEnv -> Either String (Atom, LispEnv) +evalPlus (x:xs) env = do + (value, nEnv) <- eval x env + (rest, nnEnv) <- evalPlus xs nEnv + case (value, rest) of + (AInt f, AInt s) -> Right (AInt $ f + s, nnEnv) + (AFloat f, AFloat s) -> Right (AFloat $ f + s, nnEnv) + (AFloat f, AInt s) -> Right (AFloat $ f + fromIntegral s, nnEnv) + (AInt f, AFloat s) -> Right (AFloat $ fromIntegral f + s, nnEnv) + (value, _) -> Left $ "**Error: \"" ++ show value ++"\" is not a number **" +evalPlus [] env = Right (AInt 0, env)