ho il seguente codice che utilizza l'API GHC per caricare i moduli e ottenere il tipo di un'espressione:come gestire "panico: l'impossibile è accaduto" e continuare in Haskell
typeObjects :: [String] -> [String] -> IO [Type]
typeObjects modules objects = do
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
targets <- mapM ((flip guessTarget) Nothing) modules
setTargets targets
result <- load LoadAllTargets
case result of
Failed -> error "Compilation failed"
Succeeded -> do
m <- mapM (((flip findModule) Nothing) . mkModuleName) modules
setContext m []
values <- mapM exprType objects
return values
Se le espressioni don' t TYPECHECK, l'intero programma va in crash con:
TestDynamicLoad: panic! (the 'impossible' happened)
(GHC version 7.0.3.20110330 for x86_64-unknown-linux):
Couldn't match expected type `GHC.Types.Int'
with actual type `[GHC.Types.Char]'
Come posso fare in modo che non vada in crash il programma? Voglio solo sapere quali tipi di espressioni sono stati controllati correttamente e quali no.
Se si è riusciti a bloccare il compilatore, si è verificato un errore del compilatore. Controlla se si tratta di un bug noto, altrimenti segnalalo. – Landei
Non penso che sia un bug. È corretto. Ho provato a compilare in fase di esecuzione un'espressione che ha tentato di passare in una stringa in cui era previsto un Int. Voglio solo "catturare" quell'errore e "contrassegnare" quell'espressione come fallita, mentre gli altri che non causano un errore, lo considero un successo. – mentics
@taotree Segnalare un errore è un comportamento corretto. Schiantarsi con un "panico! (L''impossibile' è successo)" non è un comportamento corretto. Segnalalo come un bug. –