代码之家  ›  专栏  ›  技术社区  ›  yairchu

haskell相当于c's_uu线__

  •  5
  • yairchu  · 技术社区  · 15 年前

    有没有办法在haskell中获取行号/追溯信息?

    (像C的 __LINE__ 宏或python的 traceback.extract_stack() )

    这对于我编写HASKEL程序来说是有用的,它生成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 回复  |  直到 13 年前
        1
  •  14
  •   John Millikin    13 年前

    你可以使用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