Eq-1.0: Repl.hs
module Repl( repl ) where
import qualified Data.Map as Map
import EqManips.Algorithm.Utils
import EqManips.Types
import EqManips.Renderer.Ascii
import EqManips.Renderer.RenderConf
import EqManips.BaseLibrary
import EqManips.InputParser.EqCode
import EqManips.EvaluationContext
import System.IO
type Context = Map.Map String (Formula ListForm)
type Evaluator = Formula ListForm -> EqContext (Formula ListForm)
repl :: Evaluator -> IO ()
repl evaluator = do
putStrLn "Eq - interactive mode"
putStrLn "exit to quit the program\n"
doer (Just defaultSymbolTable)
where doer (Just c) = evalExpr evaluator c >>= doer
doer Nothing = return ()
printErrors :: [(Formula TreeForm, String)] -> IO ()
printErrors =
mapM_ (\(f,s) -> do putStrLn s
putStrLn $ formatFormula defaultRenderConf f)
parseErrorPrint :: (Show a) => b -> a -> IO b
parseErrorPrint c err = do
putStr "Error : "
putStr $ show err
return c
evalExpr :: Evaluator -> Context -> IO (Maybe Context)
evalExpr operation prevContext = do
putStr "> "
hFlush stdout
exprText <- getLine
case exprText of
[] -> evalExpr operation prevContext
"exit" -> return Nothing
_ -> do
let formulaList = parseProgramm exprText
either (parseErrorPrint (Just prevContext))
(\formulal -> do
let rez = performLastTransformationWithContext prevContext
$ mapM operation formulal
printErrors $ errorList rez
putStr . formatFormula defaultRenderConf
. treeIfyFormula $ result rez
return . Just $ context rez
)
formulaList