Излучение предупреждений из сплайсов шаблона Хаскеля - PullRequest
6 голосов
/ 25 апреля 2011

Я знаю, что могу вызвать ошибку во время компиляции, вызвав 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 ]

5 голосов
/ 25 апреля 2011

Получается, что функция, за которой я был, была функцией Template Haskell report.Его тип подписи был в документации, но я должен был прочитать исходный код, чтобы выяснить, что он сделал.Конечно, в документации TH могут быть использованы некоторые улучшения.

В любом случае, мой todo заполнитель теперь работает отлично, и я скоро добавлю что-нибудь в Hackage, если кому-то будет интересно.

2 голосов
/ 25 апреля 2011

Я не верю, что это возможно наивно с TH, но это действительно крутая идея.

Одним из способов реализации этого было бы связывание с функциями 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, чтобы быть весьма полезным.

1 голос
/ 14 декабря 2015

Для выдачи предупреждений из сплайсов Template Haskell, Вы можете использовать reportWarning :: String -> Q ().

Это уже включает местоположение (строка и столбец). Вы можете реализовать свою функцию todo просто:

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

Дополнительная информация

@ ответ Хаммара указывает на функцию report. Это устарело с GHC 7.6 (2012) и, возможно, будет удалено из API в ближайшее время. (Тем не менее, report все еще доступен на GHC 7.10 а также в главном филиале GHC по состоянию на 2015 г.)

Используйте reportError, чтобы сообщить об ошибке и продолжить вычисление Q (в конечном итоге, все равно не получится скомпилировать)

Используйте fail для остановки с ошибкой (GHC ≤ 7.10). Которые могут не распространяется на GHC 8.0 .

...