cherry-lisp/src/Evaluator.hs

38 lines
1020 B
Haskell

module Evaluator where
import Types.Language
import Enviroment
import Data.Maybe
import Control.Monad.State
-- TODO: create a separated file for builtinProcs
-- TODO: create a BuiltinProc or something like that in data Expr, and make + a builtin proc
evalS :: Expr -> State Enviroment Expr
evalS i@(IntE _) = return i
evalS (VarE v) = do
get >>= evalS . fromJust . lookupVar v
evalS (SetE v expr) = do
get >>= put . insertVar v expr
return NilE
evalS (QuotedE e) = return e
evalS (ConsE pr args) = do
evaluatedProc <- evalS pr
resExpr <- applyS evaluatedProc args
finalExpr <- evalS resExpr
return finalExpr
evalS l@(LambdaE _ _) = return l
evalS p@(BuiltinProcE _) = return p
evalS NilE = return NilE
applyS :: Expr -> Expr -> State Enviroment Expr
applyS (LambdaE p expr) (ConsE x xs) = do
e <- applyS expr xs
get >>= put . (`extendEnv` insertVar p x emptyEnv)
return e
applyS (BuiltinProcE p) args = do
args' <- mapM evalS $ cons2List args
e <- p args'
return e
applyS e NilE = return e