haskell - GHC:插入编译日期

标签 haskell ghc

我以为已经有人问过这个问题了,但我找不到。

我希望我的程序打印出它的编译日期。最简单的设置方法是什么?

我可以想到几种可能性,但没有一个是你所说的“简单”。理想情况下,我希望能够做到 ghc --make Foo并有Foo每次运行时打印出编译日期。

脑海中浮现出各种不容易的可能性:

  • 学习模板 Haskell。了解如何使用Data.Time获取今天的日期。找到一种方法将其转换为字符串。 (现在我的程序需要 TH 才能工作。我还需要说服它每次都重新编译该模块,否则我会得到该模块的编译日期[永远不会改变]而不是整个程序。)

  • 编写一个 shell 脚本,生成一个包含系统日期的小型 Haskell 模块。 (现在我必须使用该 shell 脚本,而不是直接编译我的程序。此外,Windows 上的 shell 脚本还有很多不足之处!)

  • 坐下来编写一些 Haskell 代码,生成一个包含日期的小型 Haskell 模块。 (比以前的想法更便携 - 但仍然需要额外的构建步骤,否则打印的日期将不正确。)

  • 可能有某种方法可以通过 Cabal 来做到这一点 - 但我真的想打包这个小程序只是为了获得约会工具吗?

有人有更简单的建议吗?

最佳答案

使用 Template Haskell 来实现这一点相对简单。 您只需要:

  1. 在 Template Haskell monad 中运行 IO 操作:

    runIO :: IO a -> Exp a
    
  2. 然后创建一个字符串文字:

    stringE :: String -> ExpQ
    
  3. 将整个表达式放在准引号内。

    $( ... )
    

该程序将打印其编译时间:

{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import Data.Time

main = print $(stringE =<< runIO (show `fmap` Data.Time.getCurrentTime))

您可以将相关片段放入一个导入所有其他模块的模块中,以确保它被重新编译。

或者从版本控制系统获取当前修订信息。请参阅:TemplateHaskell and IO

关于haskell - GHC:插入编译日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17796521/

相关文章:

haskell - 为什么完全惰性是默认优化?

haskell - 实例函数的类型推断

haskell - 为什么长度为具有 2 个元素的元组返回 1,并为具有更多元素的元组给出错误?

haskell - 当我的 getter 和 setter 返回 `Either` 时,我可以构建类似镜头的东西吗?

haskell - 如何找到提供导入的库?

haskell - 如何为名称中包含非字母字符的库定义 MIN_VERSION_𝑙𝑖𝑏 宏?

haskell - 一般而言,可折叠仿函数是否有相当于头/尾的东西?

haskell - 在数据结构 Haskell 中存储值

haskell - 使用 GHC API 进行 "dry run"的代码编译

haskell - 将 musl 与 ghc 静态链接