egison-3.0.0: hs-src/Interpreter/egisoni.hs
module Main where
import Control.Applicative ((<$>), (<*>))
import Control.Monad.Error
import Data.Version
import Data.ByteString.Lazy (ByteString)
import Data.ByteString.Lazy.Char8 ()
import qualified Data.ByteString.Lazy.Char8 as B
import Text.Parsec
import Text.Parsec.ByteString.Lazy
import Text.Regex.Posix
import System.Environment
import System.Directory (getHomeDirectory)
import System.FilePath ((</>))
import System.Console.Haskeline
import Language.Egison
main :: IO ()
main = do args <- getArgs
env <- primitiveEnv >>= loadLibraries
if null args
then showBanner >> repl env "> "
else do
result <- evalEgisonTopExpr env $ (LoadFile $ args !! 0)
either print (const $ return ()) result
showBanner :: IO ()
showBanner = do
putStrLn $ "Egison Version " ++ showVersion version ++ " (C) 2011-2013 Satoshi Egi"
putStrLn $ "http://egison.pira.jp"
putStrLn $ "Welcome to Egison Interpreter!"
showByebyeMessage :: IO ()
showByebyeMessage = do
putStrLn $ "Leaving Egison Interpreter."
repl :: Env -> String -> IO ()
repl env prompt = do
home <- getHomeDirectory
liftIO (runInputT (settings home) $ loop env prompt "")
where
settings :: MonadIO m => FilePath -> Settings m
settings home = defaultSettings { historyFile = Just (home </> ".egison_history") }
loop :: Env -> String -> String -> InputT IO ()
loop env prompt' rest = do
input <- getInputLine prompt'
case input of
Nothing -> liftIO showByebyeMessage >> return ()
Just "quit" -> liftIO showByebyeMessage >> return ()
Just "" -> loop env prompt ""
Just input' -> do
let newInput = rest ++ input'
result <- liftIO $ runEgisonTopExpr env newInput
case result of
Left err | show err =~ "unexpected end of input" -> do
loop env (take (length prompt) (repeat ' ')) $ newInput ++ "\n"
Left err -> do
liftIO $ putStrLn $ show err
loop env prompt ""
Right env' ->
loop env' prompt ""