From 61a467c1be9895cc8c22b73ac0ff4350047d43e6 Mon Sep 17 00:00:00 2001 From: Kleidi Bujari Date: Tue, 13 Oct 2026 23:44:16 -0700 Subject: baseline parsing/eval --- src/Hint/Eval.hs | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'src/Hint/Eval.hs') diff --git a/src/Hint/Eval.hs b/src/Hint/Eval.hs index 48f7b46..36628dc 100644 --- a/src/Hint/Eval.hs +++ b/src/Hint/Eval.hs @@ -2,31 +2,34 @@ module Hint.Eval where import Control.Applicative ((<|>)) import qualified Data.Map as M -import Hint.Parser (Value (..)) +import Data.Maybe (fromJust) +import Hint.Data -type Ident = String -type Env = M.Map Ident Value +type Env = M.Map Identifier Expr 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)] +basic = Scope mempty -enter :: Scope -> Env -> Scope -enter (Scope es) e = Scope (e : es) +enter :: Env -> Scope -> Scope +enter e (Scope es) = Scope (e : es) leave :: Scope -> Scope leave (Scope [] ) = error "bad" leave (Scope (_ : es)) = Scope es -scopeLookup :: Ident -> Scope -> Maybe Value +scopeLookup :: Identifier -> Scope -> Maybe Expr scopeLookup _ (Scope []) = Nothing scopeLookup i (Scope (e : es)) = M.lookup i e <|> scopeLookup i (Scope es) + +eval :: Scope -> Expr -> Maybe Expr +eval _ (Literal l) = Literal <$> pure l +eval s (Ident i) = scopeLookup i s +eval scope (Bind name val rest) = + eval (enter (M.fromList [(name, fromJust $ eval scope val)]) scope) rest +eval s (If cond a b) = do + Literal (Boolean c) <- eval s cond + if c then eval s a else eval s b -- cgit v1.3.1