Существует ли способ получить 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
На самом деле вы можете использовать прагму 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