[haskell] Language.Haskell.Interpreter와 함께 실행 파일을 제공하는 방법은 무엇입니까?

hint내 프로그램과 함께 사용하기 위해 Haskell에 플러그인을 작성할 수 있도록 Haskell 인터프리터를 사용 하고 싶었습니다. 내 실행 파일을 위해 전체 Haskell 플랫폼을 제공하고 싶지 않습니다.

일반적으로 Haskell 실행 파일은 독립적입니다. 예를 들어을 지우면 PATH문제가 발생하지 않습니다.

$ PATH=. Hello
Hello world

그러나 다음을 runInterpreter지우면 폭탄을 사용하는 간단한 테스트 프로그램입니다 PATH.

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"

환경에서 사용할 수있는 라이브러리 또는 실행 파일은 무엇입니까?

otool 많은 지침을 제공하지 않습니다.

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)

에 대한 테스트 코드 TryHint는별로 중요하지 않습니다.

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter $ loadModules ["Test"] >> setTopLevelModules ["Test"] >> interpret "f" (as :: Int -> Int)
  case f of
    Left e -> print e
    Right r -> mapM_ (print . r) [1..10]

그것은 런타임에 해석 f되는 함수에 바인딩 됩니다 Test.hs. Test.hs다음과 같이 보입니다 :

module Test where
f :: Int -> Int
f x = x + 1



답변

실행 파일을 제공하는 Language.Haskell.Interpreter것은 당신이 보여준 방식과 완벽하게 어울리는 것 같습니다. PATH실행하려는 스크립트 로 설정해야 합니다.

참고로 @bennofs에서 언급했듯이 GHC API를 정적으로 링크하는 것은 GHC 7.8에 도입 된 새로운 동적 링커와 작동하지 않습니다 (대화식 코드 실행에는 이제 동적 라이브러리가 필요합니다).


답변