Haskell로 컴파일 할 때 "(파일 이름) : L (현재 행)"포함

6175 단어 ghc하스켈

결론



한 파일에서 코드의 위치를 ​​문자열로 포함하고 싶다면 이렇게 할 수 있습니다.
{-# LANGUAGE CPP #-}

let here = __FILE__ ++ ":L" ++ show (__LINE__ :: Int)

(컴파일시라고 말했지만, 저것은 거짓말이다. 이것은 아마 프리프로세스시에 해결됩니다)



Haskell에서는 함수가 단순히 예외를 낼 가능성이 있는 경우는 Either e 혹은 Maybe 를 사용한다고 생각합니다.
readFooFromSomewhere :: Bar -> Either Text Foo
readFooFromSomewhere bar =
  let result = {a result of a some calculation}
  case result of
       Baz -> Left "残念"
       Poi -> Right {some}

 이 외에 IO 문맥하에서는 함수 fail(위험, 다용 엄금. Left e 함수 이외에서의 사용을 추천하지 않습니다.
Nothing 는 주로 비정상계에서 사용된다고 생각합니다.
readFooFromSomewhere :: IO ()
readFooFromSomewhere =
  result <- {a result of a some calculation}
  case result of
       Baz -> fail "残念"
       Poi -> return {some}
main 가 사용되는 장소는 대체로 비정상계의 처리라고 생각하기 때문에 통상은 나타나지 않을 것입니다만,
만약 나타나는 경우에 issue로 보고해 주었으면 하는 경우는 이런 느낌으로 생각합니다.
readFooFromSomewhere :: IO ()
readFooFromSomewhere =
  result <- {a result of a some calculation}
  case result of
       -- vvv ここは絶対に通らないよ!もしここを通ったら木の下に埋めてもらっても構わないよ!
       Baz -> fail "Main.readFooFromSomewhere: fatal error! sorry, please report an issue if you see this :("
       -- ^^^
       Poi -> return {some}

수락



그래도 일일이.

그것에 대해 몇 가지 선택 사항이 있습니다.
  • 프로그램을 fail 옵션 GHC로 빌드하고 GHC.Stack.HasCallStackfail 사용
  • TemplateHaskell 사용
  • CPP 사용

  • 이번에는 CPP를 사용해 보겠습니다.
    그러나 GCC의 "Main.readFooFromSomewhere" 와 같은 매크로는 없는 것 같기 때문에, 대신에 --profilecurrentCallStack 로 나타냅니다.
    {-# LANGUAGE CPP #-}
    
    readFooFromSomewhere :: IO ()
    readFooFromSomewhere =
      result <- {a result of a some calculation}
      let here = __FILE__ ++ ":L" ++ show (__LINE__ :: Int)
      case result of
           Baz -> fail $ here ++ " : fatal error! sorry, please report an issue if you see this :("
           Poi -> return {some}
    

    할 수 있었습니다.

    참고


  • 코드 생성 - Haskell equivalent of C's __LINE__ - Stack Overflow
  • 좋은 웹페이지 즐겨찾기