All pastes #772744 Raw Edit

Mine

public text v1 · immutable
·published 2007-11-14 01:03 UTC
rendered paste body
-- 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