aboutsummaryrefslogtreecommitdiff
path: root/src/expr.hs
blob: e6f1f250da894d24a402bf13d0914f862bbc906e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module Expr where

import Atom


data Expr
    = EAtom Atom
    | Add Expr Expr
    | Sub Expr Expr
    | Mul Expr Expr
    | Div Expr Expr
    | Mod Expr Expr
    | Exp Expr Expr
    | Variable String
    | Function String Expr



eval :: Expr -> Maybe Atom
eval (EAtom a) = Just a
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
    show (Add e1 e2) = show e1 ++ " + " ++ show e2
    show (Sub e1 e2) = show e1 ++ " - " ++ show e2
    show (Mul e1 e2) = show e1 ++ " * " ++ show e2
    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 ++ ")"