从模板Haskell接头发出警告

时间:2011-04-25 00:12:32

标签: haskell ghc template-haskell

我知道我可以通过从拼接中调用fail来导致编译时错误,但是是否可以仅生成警告?特别是我希望在使用-Werror进行编译时可以将此警告变为错误。

基本上我要做的是:

todo :: Q Exp
todo = do
    -- emit warning somehow

    loc <- location
    let message = ... -- generate message based on loc
    [| error $(litE (stringL message)) |]

我们的想法是在编码时使用此代替undefined,但要确保它不会通过使用-Werror进行编译而进入生产代码。

myFunc x | isSimpleCase x = 42
         | otherwise = $todo

3 个答案:

答案 0 :(得分:5)

原来我所使用的函数是Template Haskell函数report。它的类型签名在文档中,但我必须阅读源代码以弄清楚它做了什么。 TH文档肯定可以使用一些改进。

无论如何,我的todo占位符现在正在完美运行,如果有人有兴趣,我会尽快在Hackage上添加一些东西。

答案 1 :(得分:2)

我不相信这可能是天真的,但这是一个非常酷的主意。

实现它的一种方法是通过绑定GHC-API警告和debug outputerror函数。

E.g。假装是GHC,

import Panic
main = sorry "help!"

生成

$ ./A                                
A: A: sorry! (unimplemented feature or known bug)
  (GHC version 7.0.2 for x86_64-unknown-linux):
    help!

构建GHC警告应该类似,检查是否设置了-Werror,并且您可以清理API非常有用。

答案 2 :(得分:1)

从Template Haskell接头发出警告, 你可以使用reportWarning :: String -> Q ()

它已包含位置(行和列)。 您只需通过以下方式实施todo功能:

todo :: Q Exp
todo = do
  reportWarning "TODO"
  [| undefined |]

更多信息

@ hammar的回答表明函数report。自GHC 7.6(2012)以来已被弃用,并且可能在不久的将来从API中删除。 (但是,report仍可用 on GHC 7.10on GHC master branch 截至2015年。)

使用reportError报告错误并继续进行Q计算 (最终无法编译)。

使用fail停止并出现错误(GHC≤7.10)。那可能 not apply on GHC 8.0