summaryrefslogtreecommitdiff
path: root/src/Hint/Eval.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hint/Eval.hs')
-rw-r--r--src/Hint/Eval.hs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/Hint/Eval.hs b/src/Hint/Eval.hs
new file mode 100644
index 0000000..48f7b46
--- /dev/null
+++ b/src/Hint/Eval.hs
@@ -0,0 +1,32 @@
+module Hint.Eval where
+
+import Control.Applicative ((<|>))
+import qualified Data.Map as M
+import Hint.Parser (Value (..))
+
+type Ident = String
+type Env = M.Map Ident Value
+
+data Scope = Scope
+ { env :: [Env] }
+ deriving (Show, Eq)
+
+defaultEnv :: Env
+defaultEnv = M.fromList [("pi", VInt 3), ("version", VString "0.1")]
+
+basic :: Scope
+basic = Scope (pure defaultEnv)
+
+next :: Env
+next = M.fromList [("ident", VInt 12), ("pi", VInt 4)]
+
+enter :: Scope -> Env -> Scope
+enter (Scope es) e = Scope (e : es)
+
+leave :: Scope -> Scope
+leave (Scope [] ) = error "bad"
+leave (Scope (_ : es)) = Scope es
+
+scopeLookup :: Ident -> Scope -> Maybe Value
+scopeLookup _ (Scope []) = Nothing
+scopeLookup i (Scope (e : es)) = M.lookup i e <|> scopeLookup i (Scope es)