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

2024-04-06

按照发布的 GHC 教程here http://www.bluishcoder.co.nz/2008/11/dynamic-compilation-and-loading-of.html并按照以下建议对此代码进行更改我之前问过的一个堆栈溢出问题 https://stackoverflow.com/questions/12779143/dynamic-compilation-in-haskell-ghc-api-error,我创建了一个程序,它能够编译并运行 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 http://www.haskell.org/pipermail/glasgow-haskell-users/2011-October/021009.html那个替换

guessTarget "Test.hs" Nothing

with

guessTarget "*Test.hs" Nothing

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

See the 通过 nabble 在页面上显示整个线程 http://haskell.1045720.n5.nabble.com/mkTopLevEnv-not-interpreted-main-Main-td4861327.html

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell GHC 动态编译仅适用于第一次编译 的相关文章

  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • 64位系统上编译32位系统-兼容性

    我有一台带有 64 位操作系统的 64 位机器 我如何使用 Visual Studio 2010 编译程序 以便它们在 32 位系统上运行 如果我在 64 位机器上安装 32 位操作系统 我认为这不会有问题 如果您正在谈论 NET 应用程序
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • 解析 PHOAS 表达式

    我想我理解 PHOAS 参数化高阶抽象语法 我明白了如何漂亮地打印一个表达式 参见http www reddit com r haskell comments 1mo59h phoas for free by edward kmett cc
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应
  • MSBuild 与编译器

    从命令提示符使用 MSBuild 和 C 编译器有什么区别 我想在不使用 Visual Studio 的情况下手动构建我的解决方案 项目 并且我想学习如何使用命令行工具 C 编译器你的意思是csc exe 如果这就是你的意思 那么csc a
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • 为什么以下内容会并行运行而不是顺序运行?

    给定以下函数evalPair parPair and deepSeq分别 evalPair Strategy a gt Strategy b gt Strategy a b evalPair sa sb a b do a lt sa a b
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • 数据类型变体之间的转换

    假设我想创建一种数据类型的两种变体 一种具有特定的构造函数 另一种没有它 否则它们是相同的 我想出了这个 LANGUAGE KindSignatures LANGUAGE DataKinds LANGUAGE GADTs data Foo
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch

随机推荐

  • ValidateCredentials 对于未知用户返回 true?

    我在这里看到一些奇怪的行为PrincipalContext ValidateCredentials 该设置是父 子设置中的两个 Active Directory 域 因此我们有主域company com和子域development comp
  • Google Slide API - 如何多次复制一张幻灯片并每次创建一个唯一的对象 ID

    一般来说 我希望人们将一些数据放入谷歌工作表中并提供一个按钮 该按钮获取数据并自动填充预制的谷歌幻灯片 我选择了复制主幻灯片 然后用数据替换单个文本模块的方法 有更好的方法来实现我的目标吗 这是主幻灯片 这是我用于复制的代码 但它只能复制母
  • 当键列具有不同名称时实体拆分?

    我正在使用 Entity Framework 4 3 1 Code First 并且需要在两个表之间拆分实体 这些表有一个共享的主键 并且是一对一的 但每个表上的列的名称并不相同 我无法控制数据布局 也不能请求任何更改 例如 SQL 表可以
  • 带锚点的 ASP.Net MVC RedirectToAction

    我有以下问题 例如我有这样的路线 routes Add new Route forums thread threadOid last new MvcRouteHandler Defaults new RouteValueDictionary
  • EnableRaisingEvents(启用和禁用它)

    我正在维护一些代码 其中有两个 FileSystemWatcher 事件 这使得调试变得困难 并且有错误 所以我的想法是通过使执行顺序化来简化代码 差不多是这样的 Main method 1 normal code here 2 enabl
  • 如何配置 Beyond Compare 以忽略注释中的 SCM 替换文本?

    我确实有一些被 SCM 替换的文本序列 在我的例子中是 Perforce 我确实想配置 BeyondCompare 将这些序列视为不重要的差异 以便在比较文件时能够忽略它们 就我而言 它是关于 Python 源文件的 序列看起来像 Id d
  • 如何在 Struts 2 中创建自定义 URL?喜欢 www.twitter.com/goodyzain

    我正在开发一个项目 我想为每个用户提供唯一的 URL 例如 www SocialNetwork com jhon www SocialNetwork com jasmine 到目前为止我能够实现这一点 www SocialNetwork c
  • Flow Shop 到布尔可满足性 [多项式时间缩减]

    我联系您是为了了解 如何将流水车间调度问题 转化为布尔可满足性 我已经对 N N 数独 N 皇后和班级调度问题进行了此类简化 但我对如何将流水车间转换为 SAT 有一些问题 SAT 问题如下所示 目标是 使用不同的布尔变量 找到每个变量的影
  • Kotlin - 为什么编译器合约只允许引用函数参数

    在编写验证函数时 这些验证函数通常会检查可空性 尽管在调用这些函数之后 可以安全地使用对象成员 就像它们不可为 null 一样 但 Kotlin 编译器契约不允许指定此行为 例如 data class EmployeeDto val nam
  • 为 Windows 创建 Ruby 应用程序

    我想开发一个Windows应用程序 老实说 我现在不太关心跨平台 但仍然很好 我想使用 Ruby 因为它的语法相当简单 而且 简单易学 我的应用程序就像一个 游戏关卡创建者 您可以在其中设计自己的关卡 然后通过读取创建者应用程序创建的项目文
  • 意外响应代码 404 齐射

    我收到以下代码发送的某些请求的错误 但我不知道为什么 private void DeActivateReq String toolID String token String Childid String url http 54 77 12
  • 如何将 AutoValue 与 Retrofit 2 结合使用?

    我已经在一个项目中使用了 AutoValue 和 android apt 插件 并且我知道 Ryan Harter 的 AutoValue gson 扩展 但是如何连接 Retrofit 2 以在抽象类上使用扩展和工厂方法 String g
  • 具有多个预览的 AVCaptureSession

    我有一个 AVCaptureSession 与 AVCaptureVideoPreviewLayer 一起运行 我可以看到视频 所以我知道它正在发挥作用 但是 我想要一个集合视图 并在每个单元格中添加一个预览层 以便每个单元格显示视频的预览
  • Celery 使连接由对等方重置

    我设置了rabbitmqserver并使用以下步骤添加了用户 uruddarraju usr lib rabbitmq lib rabbitmq server 3 2 3 sudo rabbitmqctl list users Listin
  • Chromedriver `driver.manage.logs.get(:browser)` 在 chromedriver 75.0.3770.8 上失败

    访问时driver manage logs get browser 在 chromedriver 75 0 3770 8 上我收到此错误 undefined method log for
  • pygame中的旋转

    我一直在寻找如何使我的图像围绕单个点旋转的解决方案 但据我发现 没有任何方法真正起作用 我知道的 我可以使用旋转pygame transform rotate surface angle 我需要不断重置中心 以便图像不会自行旋转 需要更新图
  • 如何设置进度条以在android中加载数据的活动

    这是我的第一堂课 进行 URL 加载 public class HelloWebViewClient extends WebViewClient Override public boolean shouldOverrideUrlLoadin
  • 如何仅使用javascript而不使用jquery进行无限滚动

    我希望用javascript而不用jquery实现无限滚动 我是 JavaScript 新手 经过网上搜索 我得到了这段代码 div div class page div div
  • 在 Javascript 中解析 JSON 响应以获取键/值对 [重复]

    这个问题在这里已经有答案了 如何仅在 Javascript 中获取每个对象的名称和值 访问对象的属性有两种方法 var obj a foo b bar obj a foo obj b bar 或者 如果您需要动态执行此操作 var key
  • Haskell GHC 动态编译仅适用于第一次编译

    按照发布的 GHC 教程here http www bluishcoder co nz 2008 11 dynamic compilation and loading of html并按照以下建议对此代码进行更改我之前问过的一个堆栈溢出问题