我一直在尝试使用GHC API实现基本的动态代码编译,并按照这里的教程进行操作。
以下是代码:
import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce
main :: IO ()
main =
defaultErrorHandler defaultDynFlags $ do
func <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Test.hs" Nothing
addTarget target
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
m <- findModule (mkModuleName "Test") Nothing
setContext [] [m]
value <- compileExpr ("Test.print")
do let value' = (unsafeCoerce value) :: String -> IO ()
return value'
func "Hello"
return ()
从名为Test.hs的另一个文件获取print函数,加载并运行它的print函数。
我使用以下命令使用ghc版本7.4.1编译代码:
ghc -package ghc --make Api.hs
但是收到了以下错误:
Api.hs:8:25:
Couldn't match expected type `Severity' with actual type `Settings'
Expected type: LogAction
Actual type: Settings -> DynFlags
In the first argument of `defaultErrorHandler', namely
`defaultDynFlags'
In the expression: defaultErrorHandler defaultDynFlags
我做错了什么?我已经查看了GHC API文档,但是对这种东西不太熟悉,大部分内容都不理解。
.hi
和.o
文件,它可能会多次工作。但这有点不方便,不是吗?所以你需要一种可以处理编译模块的方法。不幸的是,我不太了解API,无法告诉你如何做到这一点。也许这可以成为你下一个问题。 - Daniel FischerparseImportDecl
很好用,可以获取IIDecl。如果需要更多信息,请问我,现在我需要睡觉了。 - worldsayshi