gpt4 book ai didi

Haskell GHC 动态编译仅适用于第一次编译

转载 作者:行者123 更新时间:2023-12-02 11:14:04 25 4
gpt4 key购买 nike

遵循发布的 GHC 教程 here并按照 a previous stack overflow question I asked 中的建议对此代码进行更改,我创建了一个程序,它能够编译并运行 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 的引用)

最佳答案

西蒙·马洛建议 here替换

guessTarget "Test.hs" Nothing

guessTarget "*Test.hs" Nothing

应该避免您遇到的错误,因为它告诉 GHC 不要加载 .o 文件。

请参阅whole thread on a page via nabble

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

关于Haskell GHC 动态编译仅适用于第一次编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com