aboutsummaryrefslogtreecommitdiff
path: root/src/Evaluation.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-03 15:41:17 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-03 15:41:17 +0200
commit5e7d3a5ff586ac75b768a9a1c1f2d5b80960e821 (patch)
treea7f7c50ded23536dd45cbaa7ae7987472bc06932 /src/Evaluation.hs
parent99e5658feb48f15f85eaf9680affea2f490459bb (diff)
downloadcomputorv2-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.hs57
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