2017-06-24 51 views
6

Haskell STG Kaynak, ama coreToStgArgs aşağıdaki dökümü ile panicing görülmektedir.Bütün: BuradaAyıklanıyor Ben <code>Outputable</code> yoluyla <code>String</code> gibi bir Haskell kaynağının STG gösterimini elde etmek için çalışıyorum

[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 

dosya FooBar.hs olduğunu

0123: İşte
module FooBar where 

foo a = a + a 

bar :: Int -> Int 
bar b = b + 3 

kullandığım test.hs kaynağıdır: Ben ayıklamak istiyorum Bana benzer bir sorun haline tükendi önce

Birisi birkaç yıl benzer:

https://ghc.haskell.org/trac/ghc/ticket/7159

Ancak, o zamandan beri ne oldu hiçbir fikrim yok. Bu, rastgele bir Haskell kaynağının STG'sini çıkarmanın doğru yolu olup olmadığından emin değilim, bu yüzden işe yarayan daha iyi alternatifler varsa, bunları duymak isterim.

DÜZENLEME:

module FooBar where 

foo a = a + a 

bar :: Int -> Int 
bar b = 3 

Aslında, ilk bakışta, işler uyarılan Çekirdek Haskell zorlamaz eğer çalışmak görünür: STG çeviri bar b = b + 3bar b = 3 değiştirildiğinde aşağıdaki program için başarılı görünmektedir ilkel operasyonlar gerçekleştirilecek. Örneğin bar b = 3 + 9 başarısız olur.

+1

Yaptığınız hata "* Bu bir hata değil, CoreToStg.coreToStg' kullanmaya başlamadan önce" CorePrep.corePrepPgm "yi kullanmam gerekiyor. *". – melpomene

+0

Ah, biraz mücadele ettikten sonra çalışıyor :) Teşekkür ederiz! –

+0

Çalışma kodunu bir cevap olarak göndermelisiniz. – melpomene

cevap

1

melpomene Çok teşekkürler, belgelere kaçırdığım bir şeyi işaret ediyor. Ben en iyi yolu (ve dolayısıyla ModuleName) bir Target dan ModSummary kurtarmak için ne olduğundan emin değilim

import CorePrep 
import CoreToStg 
import GHC 
import GHC.Paths 
import GhcMonad 
import HscTypes 
import Outputable 
import StgSyn 
import System.IO 

mkSTG :: FilePath -> FilePath -> IO [StgBinding] 
mkSTG proj src = runGhc (Just libdir) $ do 
     env <- getSession 
     dflags <- getSessionDynFlags 
     setSessionDynFlags (dflags {importPaths = [proj]}) 
     target <- guessTarget src Nothing 
     setTargets [target] 
     load LoadAllTargets 

     mod_graph <- getModuleGraph 
     let mod_sum = head mod_graph -- This is bad practice 
     pmod <- parseModule mod_sum 
     tmod <- typecheckModule pmod 
     dmod <- desugarModule tmod 
     let guts = coreModule dmod 
     let loc = ms_location mod_sum 
     let binds = mg_binds guts 
     let tcs = mg_tcs guts 
     prep <- liftIO $ corePrepPgm env loc binds tcs 
     liftIO $ coreToStg dflags (mg_module guts) prep 

mkIOStr :: (Outputable a) => a -> IO String 
mkIOStr obj = do 
    dflags <- runGhc (Just libdir) getSessionDynFlags 
    let ppr_str = showPpr dflags obj 
    return ppr_str 

main :: IO() 
main = do 
    let proj = "/home/celery/Desktop/hue" 
    let src = proj ++ "/FooBar.hs" 
    res <- mkIOStr =<< mkSTG proj src 
    putStrLn res 

ama belli belirsiz hatırlıyorum: İşte

çalışır test.hs değiştirilmiş kaynağıdır type ModuleGraph = [ModSummary] olarak tanımlanan ModuleGraph'un ilk öğesidir.

corePrepPgm için tür imzası da ghc 7 ve 8 arasında farklıdır: iyileştirilmesi için

https://downloads.haskell.org/~ghc/7.10.1/docs/html/libraries/ghc-7.10.1/CorePrep.html

https://downloads.haskell.org/~ghc/latest/docs/html/libraries/ghc-8.0.1/CorePrep.html

Öneriler aranıyor :)

DÜZENLEME: Ben bulduk karşı örnek örnekleri - ModuleGraphhead alwa değil hedef. Geçerli geçici çözümüm, ModuleGraph içinde bulunan herhangi bir ModSummary'un, başlangıç ​​kaynak dosya konumuyla eşleşen bir konum içerip içermediğini görmek.

+0

"- Bu kötü bir uygulama" - aslında, ama GHC api, bazen temelde "kötü" şeyler yapmak için zorladığınız ([] türüyle boş olmayan bir listeyi temsil etmek gibi) tarihi kazalarla doludur. Öyleyse bu konuda çok kötü hissetme! – user2407038