2010-02-22 72 views
5

有沒有辦法在Haskell中獲取行號/追蹤信息?Haskell相當於C的__LINE__

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

這將是使用對我來說寫一個生成的C++代碼,這將有意見,說明哪哈斯克爾行負責其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 

回答

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 
+0

@dons:太棒了!我現在正在使用它,並且還更改了上面的代碼片段以反映此解決方案的外觀。看上去不錯! – yairchu 2010-02-23 21:59:37