2010-02-22 15 views
5

Czy istnieje sposób na uzyskanie informacji o liczbie linii/śledzeniu w Haskell?Odpowiednik Haskella dla C's __LINE__

(jak C na __LINE__ makro lub Pythona traceback.extract_stack())

To byłoby obsługi dla mnie za napisanie programu Haskell, który generuje kodu C++, który będzie zanotowana z uwagi mówienia która linia Haskell jest odpowiedzialny za którym C++ linii.

Haskell przykład:

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

wygeneruje ten kod 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 

Odpowiedz

14

Rzeczywiście można użyć CPP __LINE__ pragmy w Haskell.

{-# LANGUAGE CPP #-} 

main = do 
    print "one" 
    print __LINE__ 


$ runhaskell A.hs 
"one" 
5 

Ponadto, funkcja Control.Exception.assert będzie emitować numer linii, jeśli jej stan się nie powiedzie.

+0

@dons: Awesome! Używam go, a także zmieniłem fragment kodu powyżej, aby odzwierciedlić wygląd tego rozwiązania. Wygląda dobrze! – yairchu