2010-02-22 10 views
5

Existe-t-il un moyen d'obtenir des informations de numéro de ligne/retraçage dans Haskell?Haskell équivalent de C __LINE__

(comme macro C de __LINE__ ou Python traceback.extract_stack())

Ce serait utile pour moi pour écrire le programme Haskell qui génère du code C++, qui serait transcrite avec telling commentaires quelle ligne Haskell est responsable de quelle ligne C++.

exemple Haskell:

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

va générer ce code 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 

Répondre

14

Vous pouvez réellement utiliser le RPC __LINE__ pragma dans Haskell.

{-# LANGUAGE CPP #-} 

main = do 
    print "one" 
    print __LINE__ 


$ runhaskell A.hs 
"one" 
5 

En outre, la fonction Control.Exception.assert émettra un numéro de ligne si son état échoue.

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: Génial! Je l'utilise maintenant et j'ai également changé l'extrait de code ci-dessus pour refléter l'apparence de cette solution. Ça à l'air bon! – yairchu