Haskell, эквивалентный из C __ СТРОКА __

Существует ли способ получить line-number/traceback информацию в Haskell?

(как C __LINE__ макрос или Python traceback.extract_stack())

Это было бы полезно для меня для записи программы Haskell, которая генерирует код C++, который был бы записан нотами с комментариями, говорящими, какая строка Haskell ответственна за который строка C++.

Пример Haskell:

LINE "#include <foo.h>" -- this is line 12
: INDENT "void Foo::bar() {" "}"
    [ LINE $ "blah(m_" ++ x ++ ", \"" ++ x ++ "\");"
    | x <- ["Potato", "Avocado"]
    ]

сгенерирует этот код C++:

#include <foo.h>                  // gen.hs:12
void Foo::bar() {                 // gen.hs:13
  blah(m_Potato, "Potato");       // gen.hs:14
  blah(m_Avocado, "Avocado");     // gen.hs:14
}                                 // gen.hs:13
5
задан yairchu 23 February 2010 в 21:58
поделиться

1 ответ

На самом деле вы можете использовать прагму CPP __ LINE __ в Haskell.

{-# LANGUAGE CPP #-}

main = do
    print "one"
    print __LINE__


$ runhaskell A.hs
"one"
5

Кроме того, функция Control.Exception.assert выдаст номер строки, если ее условие не выполнено.

import Control.Exception

main = do
    print "one"
    assert False $
        print "two"


$ runhaskell A.hs
"one"
A.hs: A.hs:5:5-10: Assertion failed
14
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: