2015-10-03 12 views
7

मूल्यांकन के लिए अपने एपीआई के माध्यम से ghci को अभिव्यक्ति भेजने और परिणाम प्रिंट करने का सबसे सरल उदाहरण क्या होगा? मैं एक पूरा उदाहरण नहीं ढूंढ पा रहा हूं जो काम करेगा। हां, मैंने https://wiki.haskell.org/GHC/As_a_library की कोशिश की है, लेकिन मुझे त्रुटियां मिल रही हैं जो मुझे बहुत कुछ नहीं बताती: no package state yet: call GHC.setSessionDynFlags। जहां भी मैं setSessionDynFlags जो भी तर्क, या setContext के साथ कोशिश करता हूं, मैं हमेशा एक त्रुटि के साथ समाप्त होता हूं। मैं वर्तमान में (कोई setXYZ) है:लाइब्रेरी के रूप में जीएचसी का उपयोग

import GHC 
import GHC.Paths (libdir) 
import GhcMonad 
import Debugger 
import DynFlags 
import Outputable 
import Language.Haskell.HsColour 
import Language.Haskell.HsColour.Colourise 

colour :: String -> String 
colour = hscolour TTY defaultColourPrefs True True "" False 

ghci :: IO() 
ghci = runGhc (Just libdir) $ do 
    r <- runStmt "[1, 2, 3]" RunToCompletion 
    case r of 
     RunOk ns -> do 
      mapM_ (\n -> do 
        mty <- lookupName n 
        case mty of 
         Just (AnId id) -> do 
          t <- obtainTermFromId maxBound True id 
          fl <- getSessionDynFlags 
          liftIO $ putStrLn $ colour $ show $ withPprStyleDoc fl defaultUserStyle $ ppr t 
          return() 
         otherwise -> return() 
       ) ns 
     otherwise -> return() 

main :: IO() 
main = ghci 
+2

आप में रुचि हो सकती https : //hackage.haskell.org/package/hint – arrowd

+0

धन्यवाद, वास्तव में बहुत दिलचस्प लगता है! :) – jakubdaniel

उत्तर

1

तो मेरी समस्या हल था जब मैं GHC अभिव्यक्ति की शुरुआत में इस आरंभीकरण कि मैं runGhc (Just libdir) के साथ चलने कहा:

df <- getSessionDynFlags 
setSessionDynFlags $ df { hscTarget = HscInterpreted 
         , ghcLink = LinkInMemory 
         } 
setContext $ map (IIDecl . simpleImportDecl . mkModuleName) [ "Prelude" ] 
संबंधित मुद्दे