2010-02-22 12 views
5

C'è un modo per ottenere informazioni su numero di riga/traccia in Haskell?Haskell equivalente di C __LINE__

(come quello di C __LINE__ macro o Python di traceback.extract_stack())

che sarebbe di uso per me per la scrittura del programma Haskell che genera codice C++, che verrebbe notata con i commenti dire quale linea Haskell è responsabile per i quali C++ linea.

Haskell esempio:

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

genererà il codice 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 

risposta

14

Si può effettivamente utilizzare il pragma CPP __LINE__ in Haskell.

{-# LANGUAGE CPP #-} 

main = do 
    print "one" 
    print __LINE__ 


$ runhaskell A.hs 
"one" 
5 

Inoltre, la funzione Control.Exception.assert emetterà un numero di riga se condizione fallisce.

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: Fantastico! Ora lo sto usando e ho anche modificato lo snippet di codice sopra per riflettere come appare questa soluzione. Sembra buona! – yairchu