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

私が求めていた関数は、TemplateHaskell関数reportでした。その型署名はドキュメントにありましたが、ソースコードを読んでそれが何をするのかを理解する必要がありました。THのドキュメントは確かにいくつかの改善を使用することができます。

とにかく、私のtodoプレースホルダーは現在完全に機能しています。興味があれば、すぐにHackageに何かを載せます。

于 2011-04-25T04:49:34.267 に答える
2

これがTHから素朴に可能であるとは思いませんが、それは本当にクールなアイデアです。

これを実装する1つの方法は、 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

テンプレートHaskellスプライスから警告を発するために、を使用することができますreportWarning :: String -> Q ()

すでに場所(行と列)が含まれています。todo次の方法で関数を実装できます。

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

さらに詳しい情報

@hammarの答えは関数を示していますreport。GHC 7.6(2012)以降廃止されており、近い将来APIから削除される可能性があります。(ただし、 2015年現在、GHC 7.10 および GHCマスターブランチreportで引き続き使用できます 。)

reportErrorエラーを報告し、Q計算を続行するために使用します(とにかく最終的にコンパイルに失敗します)。

エラーで停止するために使用failします(GHC≤7.10)。これはGHC8.0 には当てはまらない可能性があります。

于 2015-12-14T20:24:10.850 に答える