Haskell эквивалент C's __LINE__ - PullRequest
       16

Haskell эквивалент C's __LINE__

5 голосов
/ 22 февраля 2010

Есть ли способ получить информацию о номере строки / трассировке в Haskell?

(например, макрос C __LINE__ или Python traceback.extract_stack())

Это было бы полезно для меня, чтобы написать программу на Haskell, которая генерирует код C ++, который будет отмечен комментариями, указывающими, какая строка 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 Ответ

14 голосов
/ 23 февраля 2010

Вы можете использовать прагму CPP __LINE__ в Haskell.

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