Je suis en train d'extraire la représentation STG d'une source Haskell comme String
via Outputable
, mais il semble que coreToStgArgs
est panicing avec la décharge suivante:Extracting STG de Haskell Source
[email protected] ~/Desktop/hue $ runhaskell test.hs
[foo :: forall a. Num a => a -> a
[GblId, Arity=2, Caf=NoCafRefs, Str=DmdType] =
\r srt:SRT:[] [$dNum a1] + $dNum a1 a1;,
bar :: Int -> Int
[GblId,test.hs: test.hs: panic! (the 'impossible' happened)
(GHC version 7.10.3 for x86_64-unknown-linux):
coreToStgArgs I# 3
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
Voici le fichier FooBar.hs
que je veux extraire:
module FooBar where
foo a = a + a
bar :: Int -> Int
bar b = b + 3
Voici la source de test.hs
que je:
import CoreToStg
import GHC
import GHC.Paths
import Outputable
import StgSyn
mkDynFlags :: IO DynFlags
mkDynFlags = runGhc (Just libdir) getSessionDynFlags
mkSTG :: FilePath -> FilePath -> IO [StgBinding]
mkSTG proj src = do
dflags <- mkDynFlags
ghc_core <- runGhc (Just libdir) $ do
setSessionDynFlags (dflags {importPaths = [proj]})
compileToCoreSimplified src
-- compileToCoreModule src
coreToStg dflags (cm_module ghc_core) (cm_binds ghc_core)
mkIOStr :: (Outputable a) => a -> IO String
mkIOStr obj = do
dflags <- mkDynFlags
let ppr_str = showPpr dflags obj
return ppr_str
main :: IO()
main = do
let proj = "/home/user/Desktop/hue"
let src = proj ++ "/FooBar.hs"
res <- mkIOStr =<< mkSTG proj src
putStrLn res
Il semble que quelqu'un plusieurs années avant moi a rencontré un problème similaire:
https://ghc.haskell.org/trac/ghc/ticket/7159
Cependant, je ne sais pas ce qui est arrivé depuis. Je ne sais pas non plus si c'est la bonne façon d'extraire le STG d'une source arbitraire Haskell, donc s'il y a de meilleures alternatives qui fonctionnent, j'aimerais en entendre parler.
EDIT: traduction STG apparaît réussie pour le programme suivant où bar b = b + 3
est changé en bar b = 3
:
module FooBar where
foo a = a + a
bar :: Int -> Int
bar b = 3
En fait, à première vue, les choses semblent fonctionner si le noyau Haskell induit ne force pas opérations primitives à effectuer. Par exemple bar b = 3 + 9
échoue.
Le bug que vous avez lié à dit "* Ce n'est pas un bug après tout.Je devais utiliser 'CorePrep.corePrepPgm' avant d'essayer d'utiliser' CoreToStg.coreToStg'. *". – melpomene
Ah, ça marche après un peu de lutte :) Merci! –
Vous devriez publier le code de travail en guise de réponse. – melpomene