aboutsummaryrefslogtreecommitdiff
path: root/src/expr.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr.hs')
-rw-r--r--src/expr.hs29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/expr.hs b/src/expr.hs
index 87a700b..e6f1f25 100644
--- a/src/expr.hs
+++ b/src/expr.hs
@@ -11,22 +11,25 @@ data Expr
| Div Expr Expr
| Mod Expr Expr
| Exp Expr Expr
- -- | Dot Expr Expr
+ | Variable String
+ | Function String Expr
+
eval :: Expr -> Maybe Atom
eval (EAtom a) = Just a
-eval (Add e1 e2) = evalBin e1 e2 (+?)
-eval (Sub e1 e2) = evalBin e1 e2 (-?)
-eval (Mul e1 e2) = evalBin e1 e2 (*?)
-eval (Div e1 e2) = evalBin e1 e2 (/?)
-eval (Mod e1 e2) = evalBin e1 e2 (%?)
-eval (Exp e1 e2) = evalBin e1 e2 (^?)
-
-evalBin :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom
-evalBin e1 e2 f = do a <- eval e1
- b <- eval e2
- f a b
+eval (Add e1 e2) = evalInfix e1 e2 (+?)
+eval (Sub e1 e2) = evalInfix e1 e2 (-?)
+eval (Mul e1 e2) = evalInfix e1 e2 (*?)
+eval (Div e1 e2) = evalInfix e1 e2 (/?)
+eval (Mod e1 e2) = evalInfix e1 e2 (%?)
+eval (Exp e1 e2) = evalInfix e1 e2 (^?)
+eval _ = Nothing
+
+evalInfix :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom
+evalInfix e1 e2 f = do a <- eval e1
+ b <- eval e2
+ f a b
instance Show Expr where
show (EAtom a) = show a
@@ -36,3 +39,5 @@ instance Show Expr where
show (Div e1 e2) = show e1 ++ " / " ++ show e2
show (Mod e1 e2) = show e1 ++ " % " ++ show e2
show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2
+ show (Variable name) = name
+ show (Function name e) = name ++ "(" ++ show e ++ ")"