{-# OPTIONS -fglasgow-exts #-} {- The Main REPL loop. A ship then new they built for him Of mithril and of elven-glass With shining prow; no shaven oar Nor sail she bore on silver mast; The Silmaril as lantern light And banner bright with living flame To gleam thereon by Elbereth Herself was set, who thither came... -} module Main where import Internals import AST import Eval import Shell import Parser import Help import Pretty type State = () initState = () main = getArgs >>= run run (('-':'e':str@(_:_)):args) = doRun str args run ("-e":str:args) = doRun str args run ("-h":_) = printHelp run (file:args) = readFile file >>= (`doRun` args) run [] = do hSetBuffering stdout NoBuffering isTTY <- hIsTerminalDevice stdin if isTTY then banner >> repLoop () else do str <- getContents doRun str [] repLoop :: State -> IO () repLoop state = do command <- getCommand case command of Quit -> putStrLn "Leaving pugs." Load fn -> load fn Eval str -> doEval str [] >> repLoop initState Parse str-> doParse str >> repLoop initState Help -> printHelp >> repLoop state load fn = do return () doParse str = runLex print parseOp str eval str = doEval str [] doEval str args = do runLex (putStrLn . pretty . evaluate emptyEnv) parseOp str doRun str args = do runLex (putStrLn . concatMap vCast . vCast . evaluate emptyEnv) parseOp str