diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-06-03 15:41:17 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-06-03 15:41:17 +0200 |
| commit | 5e7d3a5ff586ac75b768a9a1c1f2d5b80960e821 (patch) | |
| tree | a7f7c50ded23536dd45cbaa7ae7987472bc06932 /src/Evaluation.hs | |
| parent | 99e5658feb48f15f85eaf9680affea2f490459bb (diff) | |
| download | computorv2-5e7d3a5ff586ac75b768a9a1c1f2d5b80960e821.tar.gz computorv2-5e7d3a5ff586ac75b768a9a1c1f2d5b80960e821.tar.bz2 computorv2-5e7d3a5ff586ac75b768a9a1c1f2d5b80960e821.zip | |
Back to where I was but without the mess
Diffstat (limited to 'src/Evaluation.hs')
| -rw-r--r-- | src/Evaluation.hs | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/src/Evaluation.hs b/src/Evaluation.hs index 5356b30..db2c2b2 100644 --- a/src/Evaluation.hs +++ b/src/Evaluation.hs @@ -1,24 +1,37 @@ module Evaluation where -import Expr - --- eval :: A.Context -> Expr -> Maybe Expr --- eval c (Variable n) = do (A.Variable _ e) <- A.get c n --- eval c e --- eval c (Function n e) = do x <- eval c e --- (A.Function _ param fe) <- A.get c n --- let tmp = A.update c (A.Variable param x) --- eval tmp fe --- eval c (Add e1 e2) = evalInfix c e1 e2 (builtinAdd) --- eval c (Sub e1 e2) = evalInfix c e1 e2 (builtinSub) --- eval c (Mul e1 e2) = evalInfix c e1 e2 (builtinMul) --- eval c (Div e1 e2) = evalInfix c e1 e2 (builtinDiv) --- eval c (Mod e1 e2) = evalInfix c e1 e2 (builtinMod) --- eval c (Exp e1 e2) = evalInfix c e1 e2 (builtinExp) --- eval c (Dot e1 e2) = evalInfix c e1 e2 (builtinDot) --- eval c x = Just x --- --- evalInfix :: A.Context -> Expr -> Expr -> (Expr -> Expr -> Maybe Expr) -> Maybe Expr --- evalInfix c e1 e2 f = do a <- eval c e1 --- b <- eval c e2 --- f a b +import Data.Map as M + +import Expr as E + + +type LabelMap a = Map String a +data Context = Context { variables :: LabelMap Expr + , functions :: LabelMap (String, Expr) + } + +eval :: Context -> Expr -> Maybe Expr + +eval c (Add e1 e2) = evalInfix c e1 e2 add +eval c (Sub e1 e2) = evalInfix c e1 e2 sub +eval c (Mul e1 e2) = evalInfix c e1 e2 mul +eval c (Div e1 e2) = evalInfix c e1 e2 E.div +eval c (Mod e1 e2) = evalInfix c e1 e2 E.mod +eval c (Exp e1 e2) = evalInfix c e1 e2 E.exp +eval c (Dot e1 e2) = evalInfix c e1 e2 dot + +eval c (Variable name) = name `M.lookup` (variables c) >>= eval c + +eval (Context vars funcs) (Function name e) = + do arg <- eval (Context vars funcs) e + (argName, functionExpr) <- name `M.lookup` funcs + let localVars = insert argName arg vars + eval (Context localVars funcs) functionExpr + +eval c x = Just x + + +evalInfix :: Context -> Expr -> Expr -> (Expr -> Expr -> Maybe Expr) -> Maybe Expr +evalInfix c e1 e2 f = do a <- eval c e1 + b <- eval c e2 + f a b |
