This way whenever ^D is typed at the repl, the program gracefully
terminates and prints out the complete module.
import LLVM.IRBuilder
import LLVM.Pretty
import System.IO
import LLVM.IRBuilder
import LLVM.Pretty
import System.IO
import Text.Read (readMaybe)
import Text.Read (readMaybe)
-main = buildModuleT "main" repl
+main :: IO ()
+main = buildModuleT "main" repl >>= Text.hPutStrLn stderr . ("\n" <>) . ppll
repl :: ModuleBuilderT IO ()
repl = do
liftIO $ hPutStr stderr "ready> "
repl :: ModuleBuilderT IO ()
repl = do
liftIO $ hPutStr stderr "ready> "
- ast <- liftIO $ readMaybe <$> getLine
- case ast of
+ mline <- liftIO $ catchIOError (Just <$> getLine) eofHandler
+ case mline of
+ Nothing -> return ()
+ Just l -> do
+ case readMaybe l of
Nothing -> liftIO $ hPutStrLn stderr "Couldn't parse"
Nothing -> liftIO $ hPutStrLn stderr "Couldn't parse"
- Just x -> do
- hoist $ buildAST x
+ Just ast -> do
+ hoist $ buildAST ast
mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
repl
where
mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
repl
where
+ eofHandler e
+ | isEOFError e = return Nothing
+ | otherwise = ioError e
type Binds = Map.Map String Operand
type Binds = Map.Map String Operand