我一直在尝试按照此处找到的教程使用 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 的文件中获取打印功能,加载它并运行它的打印功能。
我使用 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 文档,但对这类事情还不够精通,无法理解其中的大部分内容。