hjs-0.2: src/HJS/Interpreter.hs~
module HJS.Interpreter where
import Control.Monad.Identity
import Control.Monad.Error
import Control.Monad.State
import qualified Data.Map as M
import HJS.Interpreter.InterpMDecl
import HJS.Interpreter.InterpM
import HJS.Interpreter.Interp
import HJS.Interpreter.Host
runInterp :: InterpC p => p -> InterpM Value
runInterp p = do
initEnvironment
-- addBuiltIn
interp p
runProgram' p = runIdentity $ runStateT (runErrorT (runInterp p)) emptyState
runProgram :: InterpC a => Bool -> a -> IO Bool
runProgram flags p = do
let (ret,state) = runProgram' p
case ret of
Left err -> do let (_,_,pos) = state
putStrLn $ "Position: " ++ (show pos)
putStrLn (show err )
handleRunResult flags (undefinedValue, state)
Right r -> handleRunResult flags (r,state)
handleRunResult True (v,(ec,s,p)) = do
let out = getOut s
putStrLn $ "Return: " ++ (show v)
putStrLn $ "Output: " ++ (show out)
putStrLn $ "Execution Context" ++ (show ec)
putStrLn $ "Heap: "
mapM_ (\(i,o) -> do
putStr $ (show i) ++ " -> "
putStrLn (show o)) (M.toList s)
case (prj v) of
(Just b :: Maybe Bool) -> return b
_ -> return False
handleRunResult False (v,(ec,s,p)) = do
let out = getOut s
case out of
Nothing -> return ()
(Just out') -> putStrLn $ "Output: " ++ (show out')
case (prj v) of
(Just b :: Maybe Bool) -> return b
_ -> return False
getOut s = out where (out::Maybe String) = do
go <- M.lookup globalObj s
(o,_) <- M.lookup "_output" (properties go)
return $ show o