
Hi Pepe Pepe Iborra wrote:
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?
It could behave like most other IO actions which produce values - return them to the caller. For instance readFile :: FilePath -> IO String . runStmt could have the following type: runStmt :: Session -> String -> IO (RunResult, String) where the returned String would contain either the error or the result from evaluating the statement.
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]:
Yes, that works for me. Greetings, Mads
\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