Haskell相当于C的__LINE__

时间:2010-02-22 20:55:52

标签: haskell code-generation stack-trace

有没有办法在Haskell中获取行号/回溯信息?

(如C的__LINE__宏或Python的traceback.extract_stack()

这对我来说是有用的,可以编写生成C ++代码的Haskell程序,这个代码将用注释来表示哪个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

1 个答案:

答案 0 :(得分:14)

您实际上可以在Haskell中使用CPP __LINE__编译指示。

{-# 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