From b029315b7438b90b11d397c0db461065c8054bab Mon Sep 17 00:00:00 2001 From: Kleidi Bujari Date: Thu, 8 Oct 2026 00:38:07 -0700 Subject: simple stackful dictionary for tracking scope --- src/Hint/Eval.hs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/Hint/Eval.hs (limited to 'src/Hint/Eval.hs') 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) -- cgit v1.3.1