Generate the module inside the repl
[kaleidoscope-hs.git] / Main.hs
diff --git a/Main.hs b/Main.hs
index bff1c08c965c037080cc6aba052a60c40f1dc999..ee8ee608da79855741c0fab9cc68a63b9b5c88f6 100644 (file)
--- a/Main.hs
+++ b/Main.hs
@@ -2,6 +2,7 @@
 
 import AST as K -- K for Kaleidoscope
 import Utils
+import Control.Monad.Trans.Class
 import Control.Monad.Trans.Reader
 import Control.Monad.IO.Class
 import Data.String
@@ -25,15 +26,11 @@ import Text.Read (readMaybe)
 
 main :: IO ()
 main = do
-  mdl' <- buildModuleT "main" repl
-  withContext $ \ctx -> withHostTargetMachine $ \tm ->
-    withModuleFromAST ctx mdl' $ \mdl -> do
-      let spec = defaultCuratedPassSetSpec { optLevel = Just 3 }
-      -- this returns true if the module was modified
-      withPassManager spec $ flip runPassManager mdl
-      Text.hPutStrLn stderr . ("\n" <>) . ppllvm =<< moduleAST mdl
+  withContext $ \ctx -> withHostTargetMachine $ \tm -> do
+    ast <- runReaderT (buildModuleT "main" repl) ctx
+    return ()
 
-repl :: ModuleBuilderT IO ()
+repl :: ModuleBuilderT (ReaderT Context IO) ()
 repl = do
   liftIO $ hPutStr stderr "ready> "
   mline <- liftIO $ catchIOError (Just <$> getLine) eofHandler
@@ -45,6 +42,14 @@ repl = do
         Just ast -> do
           hoist $ buildAST ast
           mostRecentDef >>= liftIO . Text.hPutStrLn stderr . ppll
+
+          ast <- moduleSoFar "main"
+          ctx <- lift ask
+          liftIO $ withModuleFromAST ctx ast $ \mdl -> do
+            let spec = defaultCuratedPassSetSpec { optLevel = Just 3 }
+            -- this returns true if the module was modified
+            withPassManager spec $ flip runPassManager mdl
+            Text.hPutStrLn stderr . ("\n" <>) . ppllvm =<< moduleAST mdl
       repl
   where
     eofHandler e