2015-10-03 17 views
7

Ví dụ đơn giản nhất là gửi biểu thức tới ghci thông qua api của nó để đánh giá và in kết quả là gì? Tôi không thể tìm thấy một ví dụ hoàn chỉnh có thể hoạt động. Có, tôi đã thử https://wiki.haskell.org/GHC/As_a_library nhưng tôi vẫn gặp lỗi mà không cho tôi biết nhiều: no package state yet: call GHC.setSessionDynFlags. Bất cứ nơi nào tôi thử setSessionDynFlags với bất kỳ đối số nào, hoặc setContext, tôi luôn kết thúc với một lỗi. Tôi hiện có (không setXYZ):Sử dụng GHC làm thư viện

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

Bạn có thể quan tâm https : //hackage.haskell.org/package/hint – arrowd

+0

Cảm ơn bạn, điều đó thực sự có vẻ rất thú vị! :) – jakubdaniel

Trả lời

1

Vì vậy, vấn đề của tôi đã được giải quyết khi tôi thêm khởi này vào lúc bắt đầu của biểu thức GHC mà tôi chạy với runGhc (Just libdir):

df <- getSessionDynFlags 
setSessionDynFlags $ df { hscTarget = HscInterpreted 
         , ghcLink = LinkInMemory 
         } 
setContext $ map (IIDecl . simpleImportDecl . mkModuleName) [ "Prelude" ] 
Các vấn đề liên quan