7

我知道我可以通过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
4

3 回答 3

5

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

无论如何,我的todo占位符现在工作得很好,如果有人感兴趣,我会尽快在 Hackage 上发布一些内容。

于 2011-04-25T04:49:34.267 回答
2

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

实现它的一种方法是通过绑定到GHC-API警告和调试输出错误函数。

例如假装是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 以使其非常有用。

于 2011-04-25T00:20:05.283 回答
1

要从 Template Haskell 拼接发出警告,您可以使用reportWarning :: String -> Q ().

它已经包括位置(行和列)。您可以todo简单地通过以下方式实现您的功能:

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

更多信息

@hammar 的回答表明了 function report。它自 GHC 7.6 (2012) 以来已被弃用,并且可能会在不久的将来从 API 中删除。(但是, 截至 2015 年,report仍可 在 GHC 7.10GHC 主分支上使用。)

用于reportError报告错误并继续Q计算(最终还是编译失败)。

用于fail因错误停止 (GHC ≤ 7.10)。这可能 不适用于 GHC 8.0

于 2015-12-14T20:24:10.850 回答