Tôi đang cố gắng biên dịch động và tải mô-đun Haskell bằng API GHC. Tôi hiểu rằng API biến động khá nhiều từ phiên bản này sang phiên bản khác nên tôi đang nói cụ thể về GHC 7.6. *.Tự động tải mô-đun Haskell đã biên dịch - GHC 7.6
Tôi đã thử chạy cùng một mã trên MacOS và Linux. Trong cả hai trường hợp, mô đun Plugin biên dịch tốt nhưng cho lỗi sau khi tải: Cannot add module Plugin to context: not interpreted
Vấn đề tương tự như ở mô-đun this nơi mô-đun sẽ chỉ tải nếu nó được biên dịch trong cùng một chương trình máy chủ.
-- Host.hs: compile with ghc-7.6.*
-- $ ghc -package ghc -package ghc-paths Host.hs
-- Needs Plugin.hs in the same directory.
module Main where
import GHC
import GHC.Paths (libdir)
import DynFlags
import Unsafe.Coerce
main :: IO()
main =
defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
result <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Plugin.hs" Nothing
setTargets [target]
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
setContext [IIModule (mkModuleName "Plugin")]
result <- compileExpr ("Plugin.getInt")
let result' = unsafeCoerce result :: Int
return result'
print result
Và plugin:
-- Plugin.hs
module Plugin where
getInt :: Int
getInt = 33