2017-06-24 15 views
6

मैं Outputable के माध्यम से एक String के रूप में एक हास्केल स्रोत के एसटीजी प्रतिनिधित्व निकालने के लिए कोशिश कर रहा हूँ, लेकिन coreToStgArgs तरह निम्नलिखित डंप साथ panicing है यह लग रहा है:निकाला जा रहा है एसटीजी स्रोत

[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 

यहाँ फ़ाइल FooBar.hs है

0123:

module FooBar where 

foo a = a + a 

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

यहाँ test.hs का स्रोत है कि मैं प्रयोग किया जाता है: मैं निकालना चाहते हैं कि

यह कोई है कई वर्षों की तरह लग रहा से पहले मुझे एक ऐसी ही समस्या में पड़ गया है:

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

हालांकि, मुझे पता नहीं क्या हो गया है के बाद से की है। मुझे यह भी यकीन नहीं है कि मनमाने ढंग से हास्केल स्रोत के एसटीजी निकालने के बारे में यह सही तरीका है, इसलिए यदि काम करने वाले बेहतर विकल्प हैं, तो मैं उनके बारे में सुनना चाहता हूं।

संपादित करें:

module FooBar where 

foo a = a + a 

bar :: Int -> Int 
bar b = 3 

वास्तव में, पहली नज़र में, बातें करता है, तो प्रेरित कोर हास्केल के लिए मजबूर नहीं करता है काम करने के लिए दिखाई देते हैं: एसटीजी अनुवाद निम्नलिखित कार्यक्रम है जहाँ bar b = b + 3bar b = 3 परिवर्तित करने के लिए के लिए सफल प्रतीत होता है आदिम संचालन किया जाना है। उदाहरण के लिए bar b = 3 + 9 विफल रहता है।

+1

बग आप से जुड़ा हुआ कहते हैं, "* यह एक बग सब के बाद नहीं है। मैं' CorePrep.corePrepPgm' 'CoreToStg.coreToStg'। * उपयोग करने के लिए प्रयास करने से पहले का उपयोग करने के लिए आवश्यक"। – melpomene

+0

आह, यह कुछ संघर्ष के बाद काम करता है :) धन्यवाद! –

+0

आपको कार्य कोड को उत्तर के रूप में पोस्ट करना चाहिए। – melpomene

उत्तर

1

कुछ मैं दस्तावेज में याद किया उनका कहना है के लिए melpomene लिए बहुत धन्यवाद।

यहाँ test.hs की संशोधित स्रोत है कि काम करता है:

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 

मैं सबसे अच्छा तरीका क्या ठीक करने के लिए एक ModSummary (और इसलिए ModuleName) एक Target से है यकीन नहीं है, लेकिन मैं थोड़ा याद है यह ModuleGraph का पहला तत्व है, जिसे type ModuleGraph = [ModSummary] के रूप में परिभाषित किया गया है।

corePrepPgm के लिए प्रकार हस्ताक्षर भी GHC 7 और 8 के बीच अलग है: सुधार के लिए

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

सुझाव हैं स्वागत :)

संपादित: मैं पाया है इसके लिए काउंटर उदाहरणों के उदाहरण - headModuleGraph अल्वा नहीं है लक्ष्य है। मेरा वर्तमान कार्यप्रणाली यह देखने के लिए है कि ModSummaryModuleGraph के भीतर कोई स्थान है जो प्रारंभिक स्रोत फ़ाइल स्थान से मेल खाता है।

+0

"- यह बुरा अभ्यास है" - वास्तव में, लेकिन जीएचसी एपीआई ऐतिहासिक दुर्घटनाओं से भरा हुआ है (जैसे '[]' प्रकार के साथ एक गैर-खाली सूची का प्रतिनिधित्व करना) जो कभी-कभी मूल रूप से आपको "बुरी" चीजों को करने के लिए मजबूर करता है। तो इसके बारे में बहुत बुरा मत मानो! – user2407038

संबंधित मुद्दे