git @ Cat's Eye Technologies Mascarpone / eb76119
Store program state in a record, including the I/O functions. Chris Pressey 5 years ago
2 changed file(s) with 33 addition(s) and 25 deletion(s). Raw diff Collapse all Expand all
109109 -- ======================== Program States ========================= --
110110 -----------------------------------------------------------------------
111111
112 data State = State Stack Interpreter Debugger
113
114 getInterpreter (State _ i _) = i
115 setInterpreter (State s _ d) i = State s i d
116
117 statePush (State s i d) head = State (push s head) i d
118 statePushString (State s i d) str = State (pushString s str) i d
119
120 statePop (State s i d) =
112 data State = State {
113 stack :: Stack,
114 interpreter :: Interpreter,
115 debugger :: Debugger,
116 getCh :: IO Char,
117 putCh :: Char -> IO ()
118 }
119
120
121
122 getInterpreter State{ interpreter=i } = i
123 setInterpreter state i = state{ interpreter=i }
124
125 getStack State{ stack=s } = s
126
127 statePush st@State{ stack=s } head = st{ stack=(push s head) }
128 statePushString st@State{ stack=s } str = st{ stack=(pushString s str) }
129
130 statePop st@State{ stack=s } =
121131 let
122132 (elem, s') = pop s
123133 in
124 (elem, (State s' i d))
125 statePopString (State s i d) =
134 (elem, st{ stack=s' })
135 statePopString st@State{ stack=s } =
126136 let
127137 (string, s') = popString s
128138 in
129 (string, (State s' i d))
130
131 stateDebug program state@(State _ _ debugger) =
132 debugger program state
139 (string, st{ stack=s' })
140
141 stateDebug program st@State{ debugger=debugger } =
142 debugger program st
133143
134144
135145 -----------------------------------------------------------------------
586596 nullDebugger p s = do
587597 return ()
588598
589 stdDebugger program@(instr:rest) (State s i d) = do
599 stdDebugger program@(instr:rest) state = do
590600 putStr "\n"
591601 putStr ("Instr: " ++ [instr] ++ "\n")
592602 putStr ("Rest: " ++ rest ++ "\n")
593 putStr ("Stack: " ++ (show s) ++ "\n")
594 putStr ("Interp: " ++ (show i) ++ "\n")
603 putStr ("Stack: " ++ (show (stack state)) ++ "\n")
604 putStr ("Interp: " ++ (show (interpreter state)) ++ "\n")
595605 putStr "(press ENTER) "
596606 control <- getChar
597607 return ()
632642 (Intrinsic ' ' opNop)
633643 NoInterp
634644
635 runWith string debugger =
636 let
637 initialState = (State (Stack []) NoInterp debugger)
645 runWith string dbgr =
646 let
647 initialState = State{ stack=(Stack []), interpreter=NoInterp, debugger=dbgr, getCh=getChar, putCh=putChar }
638648 in
639649 execute (Program string initialInterpreter) initialState
640650
00 module Main where
11
22 import System.Environment
3 import Language.Mascarpone (mascarpone, debug, State(State))
4
5 showState (State s _ _) = (show s)
3 import Language.Mascarpone (mascarpone, debug, getStack)
64
75 main = do
86 args <- getArgs
1816 ["-r", fileName] -> do
1917 c <- readFile fileName
2018 r <- mascarpone c
21 putStrLn (showState r)
19 putStrLn $ show $ getStack r
2220 _ -> do
2321 putStrLn "Usage: mascarpone [-d|-r] <filename.mascarpone>"