繁体   English   中英

Haskell GHC Dynamic Compliation仅适用于第一次编译

[英]Haskell GHC Dynamic Compliation Only works on first compile

按照此处发布的GHC教程和此代码的更改,遵循我之前的堆栈溢出问题中的建议,我已经创建了一个程序,它能够在Test.hs中编译和运行一个带有函数print的模块来打印字符串到屏幕:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultLogAction $ 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 [IIModule m]
            value <- compileExpr ("Test.print")
            do let value' = (unsafeCoerce value) :: String -> IO ()
               return value'
      func "Hello"
      return ()

正如评论中所指出的,这段代码的问题在于,它似乎只在您第一次运行它时才起作用(当Test.hs尚未被编译时)。 如果您尝试再次运行代码,则会出现以下错误:

mkTopLevEnv: not interpreted main:Test

我相信这与代码已经编译的事实有关。 如果我删除.hi和.o文件并再次运行程序,程序将以正确的输出正确运行。 我错过了什么? 我目前正在使用ghc版本7.4.1

(注意:我试过查看GHC API,但找不到对mkTopLevEnv的任何引用)

Simon Marlow 在这里建议更换

guessTarget "Test.hs" Nothing

guessTarget "*Test.hs" Nothing

应该避免你得到的错误,理由是它告诉GHC不要加载.o文件。

通过nabble查看页面上整个主题

当然,你每次都可以删除.hi和.o文件,但这是一个丑陋的解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM