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에 도입 된 새로운 동적 링커와 작동하지 않습니다 (대화식 코드 실행에는 이제 동적 라이브러리가 필요합니다).