
Mads On 04/05/2007, at 19:19, Mads Lindstrøm wrote:
Hi Pepe
I would have liked something cross-platform.
Take a look at the unix-compat[1] package by Bjorn Bringert, although it looks like it won't help you. Maybe it can be extended.
Also, if stmt contains an error, wrapStmt will not be evaluated, and the resulting error is written to standard output or maybe to standard error. Whichever way, I am back to the same problem.
What else should be the behaviour in the case stmt contains an error? You can capture errors and stop them being written out very easily. Take a look at this snippet (not mine, it's beschmi's code) from Shim [2]: \begin{code} load' :: FilePath -> Maybe String -> SHM (SuccessFlag, [CompileNote],Session) load' sourcefile source = do source' <- addTime source ses <- getSessionFor sourcefile dflags0 <- io $ GHC.getSessionDynFlags ses ref <- io $ MVar.newMVar [] let dflags1 = dflags0{ log_action = logMsg ref } io $ GHC.setSessionDynFlags ses dflags1 io $ GHC.setTargets ses [Target (TargetFile sourcefile Nothing) source'] loadResult <- io $ GHC.load ses LoadAllTargets cnotes <- io $ reverse `liftM` MVar.readMVar ref case loadResult of Succeeded -> do -- GHC takes care of setting the right context modq <- io $ findModuleInFile ses sourcefile io $ GHC.setContext ses [modq] [] return (Succeeded,cnotes,ses) Failed -> do -- We take care of getting at least the Prelude io(GHC.setContext ses [] =<< atomM (getPrelude ses)) return (Failed,cnotes,ses) where atomM = liftM (:[]) logMsg ref severity' srcSpan' style' msg' = do dir <- getCurrentDirectory logS ('\n':show ((mkLocMessage srcSpan' msg') style')) MVar.modifyMVar_ ref (\l -> return $ (CompileNote severity' srcSpan' style' msg' dir):l) \end{code} Here, DynFlags.logAction is being filled with a handler that writes to a MVar instead of the default handler that writes to stdout. pepe [1] - http://hackage.haskell.org/cgi-bin/hackage-scripts/package/unix- compat-0.1 [2] - http://shim.haskellco.de/shim/Shim/Hsinfo.hs