如何使用Language.Haskell.Interpreter发送可执行文件?

Mic*_*Fox 136 haskell packaging shipping

我希望能够嵌入一个Haskell解释器,hint这样我就可以在Haskell中编写插件来与我的程序一起使用.我不想为我的可执行文件发布整个Haskell平台.

通常,Haskell可执行文件是非常独立的.例如,擦除PATH不会导致问题:

$ PATH=. Hello
Hello world
Run Code Online (Sandbox Code Playgroud)

但是,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"
Run Code Online (Sandbox Code Playgroud)

环境中必须提供哪些库或可执行文件才能使其工作?

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)
Run Code Online (Sandbox Code Playgroud)

测试代码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]
Run Code Online (Sandbox Code Playgroud)

它只是绑定fTest.hs要在运行时解释的函数.Test.hs看起来像这样:

module Test where
f :: Int -> Int
f x = x + 1
Run Code Online (Sandbox Code Playgroud)

Him*_*hra 2

传送可执行文件Language.Haskell.Interpreter似乎与您所展示的方式完美匹配。您必须将您的脚本设置PATH为您想要执行的脚本。

另外,正如 @bennofs 在评论中提到的,静态链接 GHC API 不适用于 GHC 7.8 中引入的新动态链接器(交互式代码执行现在需要动态库)。