module Main where import Data.List import Language.Haskell.Interpreter import SyntaxChecker import System.Console.Haskeline import System.Environment (getArgs) main :: IO () main = do fPath <- getFile case fPath of "" -> run [] fPath _ -> do m <- getModule fPath let ns = getNames m if isCoreModule ns m then run ns fPath else error "This is not a vaild Core Haskell Source file." run :: [String] -> String -> IO () run ns fPath = runInputT defaultSettings (loop fPath) where loop :: String -> InputT IO () loop fp = do minput <- getInputLine "Prelude> " case minput of Nothing -> return () Just "quit" -> return () Just input -> do rst <- liftIO (evaluate ns fp input) outputStrLn $ "Result: " ++ rst loop fp getFile :: IO String getFile = do args <- getArgs case args of [] -> return "" [fPath] -> return (if ".hs" `isSuffixOf` fPath then fPath else error "This is not a vaild haskell source file.") _ -> return (error "You can't supply more than one file.") evaluate :: [String] -> String -> String -> IO String evaluate ns fPath expr = do r <- runInterpreter (evaluate' ns fPath expr) case r of Left err -> return (show err) Right rst -> return rst evaluate' :: [String] -> String -> String -> InterpreterT IO String evaluate' ns fPath expr = do -- you can't end with ...hs\ or ...hs/ let mPath = take (length fPath -3) fPath case mPath of "" -> evalExpr expr _ -> do loadFile mPath --liftIO (putStrLn ("Module Loaded: " ++ mPath)) evalExpr expr where -- Only test with current directory loadFile mPath = do loadModules [mPath ++ ".hs"] -- todo handle custom module name, instead of harded coded Main setTopLevelModules ["Main"] --getModuleExports mPath evalExpr expression = if isCoreExpression ns expr then do setImportsQ [("Prelude", Nothing)] result <- eval expression return (show result) else error "This is not a vaild haskell statement"