mueval-0.2: Mueval/Interpreter.hs
-- TODO: suggest the convenience functions be put into Hint proper?
module Mueval.Interpreter (interpreterSession, printInterpreterError, ModuleName) where
import Language.Haskell.Interpreter.GHC (eval, newSession, reset, setImports,
setUseLanguageExtensions, typeChecks,
typeOf, withSession,
Interpreter, InterpreterError, ModuleName)
import Control.Monad.Trans (liftIO)
import System.Exit (exitWith, ExitCode(ExitFailure))
say :: String -> Interpreter ()
say = liftIO . putStr . take 1024
printInterpreterError :: InterpreterError -> IO ()
printInterpreterError e = do putStrLn $ take 1024 $ "Oops... " ++ (show e)
(exitWith $ ExitFailure 1)
interpreter :: [ModuleName] -> String -> Interpreter ()
interpreter modules expr = do setUseLanguageExtensions False -- Don't trust the extensions
reset -- Make sure nothing is available
setImports modules
checks <- typeChecks expr
if checks then do
say "Expression type: "
say =<< typeOf expr
result <- eval expr
say $ "\nresult: " ++ show result ++ "\n"
else error "Expression does not type check."
interpreterSession :: [ModuleName] -> String -> IO ()
interpreterSession mds expr = newSession >>= (flip withSession) (interpreter mds expr)