Tôi có một chức năng Haskell hiện có sử dụng API GHC để tự động tải mã biên dịch từ một mô-đun. Nó dựa trên mã từ bài đăng trên blog Dynamic Compilation and Loading of Modules in Haskell.GHC API - Cách tải động mã Haskell từ mô-đun được biên dịch bằng GHC 7.2?
Mã này hoạt động tốt trong GHC 7.0, nhưng đã được một chút thay đổi để biên dịch trong GHC 7.2, vì API GHC thay đổi.
Mã bây giờ ném một lỗi runtime trong GHC 7.2:
mkTopLevEnv: not a home module (module name):(function name)
Mã này là
evalfuncLoadFFI String moduleName,
String externalFuncName,
String internalFuncName = do
result <- liftIO $ defaultRunGhc $ do
dynflags <- GHC.getSessionDynFlags
_ <- GHC.setSessionDynFlags dynflags
m <- GHC.findModule (GHC.mkModuleName moduleName) Nothing
--------------------------------------------------------
-- The following code works fine in GHC 7.0.4:
--
-- GHC.setContext [] [(m, Nothing)]
--
-- This new code attempts to set context to the module,
-- but throws an error in GHC 7.2:
--
(_,oi) <- GHC.getContext
GHC.setContext [m] oi
--------------------------------------------------------
fetched <- GHC.compileExpr (moduleName ++ "." ++ externalFuncName)
return (Unsafe.Coerce.unsafeCoerce fetched :: [LispVal] -> IOThrowsError LispVal)
defineVar env internalFuncName (IOFunc result)
Để tham khảo, mã đầy đủ có sẵn trực tuyến tại FFI.hs (github.com).
Có ai có bất kỳ ý tưởng làm thế nào để sửa chữa hoặc làm việc xung quanh vấn đề này?
Ngoài ra, điều này có thể được gây ra bởi sự an toàn Haskell mới thay đổi trong GHC 7.2, hoặc là nó chỉ do sửa đổi API GHC?
Điều đó đã hoạt động hoàn hảo. Cảm ơn bạn về cú pháp thích hợp và giải thích chi tiết! Thưởng thức tiền thưởng của bạn :) –
Tôi cũng đã thêm cú pháp cho GHC 7.4.1 trong trường hợp nó có thể có lợi cho bất kỳ ai khác. –