我以为已经有人问过这个问题了,但我找不到。
我希望我的程序打印出它的编译日期。最简单的设置方法是什么?
我可以想到几种可能性,但没有一个是你所说的“简单”。理想情况下,我希望能够做到 ghc --make Foo
并有Foo
每次运行时打印出编译日期。
脑海中浮现出各种不容易的可能性:
学习模板 Haskell。了解如何使用
里>Data.Time
获取今天的日期。找到一种方法将其转换为字符串。 (现在我的程序需要 TH 才能工作。我还需要说服它每次都重新编译该模块,否则我会得到该模块的编译日期[永远不会改变]而不是整个程序。)编写一个 shell 脚本,生成一个包含系统日期的小型 Haskell 模块。 (现在我必须使用该 shell 脚本,而不是直接编译我的程序。此外,Windows 上的 shell 脚本还有很多不足之处!)
坐下来编写一些 Haskell 代码,生成一个包含日期的小型 Haskell 模块。 (比以前的想法更便携 - 但仍然需要额外的构建步骤,否则打印的日期将不正确。)
可能有某种方法可以通过 Cabal 来做到这一点 - 但我真的想打包这个小程序只是为了获得约会工具吗?
有人有更简单的建议吗?
最佳答案
使用 Template Haskell 来实现这一点相对简单。 您只需要:
在 Template Haskell monad 中运行 IO 操作:
runIO :: IO a -> Exp a
然后创建一个字符串文字:
stringE :: String -> ExpQ
将整个表达式放在准引号内。
$( ... )
该程序将打印其编译时间:
{-# 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/