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


136

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

6
이 문제를 재현 할 수 없습니다. 내가 실행하면 PATH= ./TryHint모든 것이 순조롭게 진행됩니다. 몇 개의 숫자를 인쇄 한 다음 종료됩니다. 나는 또한 GHC 7.8.3을 사용하고 있습니다. 어떻게 지내고 TryHint있습니까?
Daniel Wagner

7
또한 OSX에만 해당 될 것으로 생각합니다. 당신은 GHC의에서 티켓을 열 수도 있습니다 추적기 (결국, 불가능한 오류 메시지에서 언급 한 바와 같이 않았다 단지 일).
MasterMastic

5
나는 그 오류로 무슨 일이 일어나고 있는지 전혀 모른다. 어쨌든 GHC는 PATH=.Prelude의 인터페이스 파일과 전 이적으로 가져온 모든 것, 실제 라이브러리 파일과 같이 숨기지 않는 많은 리소스에 달려있다. base 및 ghc-prim 및 integer-gmp 및 GHC settings파일. (기본적으로 모든 것이 설치되어 /usr/lib/ghc있거나 그에 상응하는 디렉토리에 설치되어 있습니다.)
Reid Barton

2
@MichaelFox는 GHC API를 정적으로 연결하는 것이 GHC 7.8에 도입 된 새로운 동적 링커와 작동하지 않습니다. (대화식 코드 실행에는 동적 라이브러리가 필요합니다)
bennofs

2
@bennofs 댓글을 거의 바꾸지 않으면 거의 답이 될 것 같습니다!
sclv

답변:


2

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.