-- an abstract syntax for Pal
data Value = Num Float | FuncVal Idlist Exprlist | None
deriving (Eq, Show)
data Expr = Lit Float | FuncDef Idlist Exprlist
| Var String | Dcl String Expr | Assign String Expr
| FuncCall String Exprlist
deriving (Eq, Show)
type Exprlist = [ Expr ]
type Idlist = [ String ]
type Frame = [ (String, Value) ]
type State = [ Frame ]
-- functions adapated from Clite
find :: String -> Frame -> Value
find var [ ] = None
find var (s:ss)
| var == (fst s) = snd s
| otherwise = find var ss
get :: String -> State -> Value
get var (s:ss)
| findem /= None = findem
| otherwise = get var ss
where
findem = find var s
onion :: String -> Value -> Frame -> Frame
onion var val [ ] = [ ]
onion var val (s:ss)
| var == (fst s) = (var, val) : ss
| otherwise = s : (onion var val ss)
put :: String -> Value -> State -> State
put var val (s:ss)
| onionem /= s = onionem : ss
| otherwise = s : (put var val ss)
where
onionem = onion var val s
-- basic interpretor functions
-- as you start to implement each function, first uncommnet prototyep
val :: Expr -> State -> Value
val exp stat = 5
env :: Expr -> State -> State
env exp stat = 5
interp :: (Value, State) -> Exprlist -> (Value, State)
interp (vl, st) (s:es)
| null es /= True = interp (v, en)
| otherwise = (v, en)
where
v = val s st
en = env s st
pal :: Exprlist -> (Value, State)
pal es = interp (None, [[]]) es