如何使用Language.Haskell.Interpreter交付可执行文件?


136

我希望使用嵌入Haskell解释器,hint以便可以在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]

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

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

6
我无法重现此问题。当我运行时,PATH= ./TryHint一切运行顺利:先打印一些数字,然后退出。我也在使用GHC 7.8.3。你怎么建的TryHint
丹尼尔·瓦格纳

7
我也相信它可能特定于OSX。您可能要按照错误消息中的说明在GHC的跟踪器上打开一张票(毕竟,不可能的事情刚刚发生了)。
MasterMastic 2015年

5
我不知道该错误发生了什么,但是无论如何,GHC依赖于很多您没有用它隐藏的资源PATH=.,例如Prelude的接口文件以及它以可传递方式导入的所有内容,以及该文件的实际库文件。 base和ghc-prim和integer-gmp,以及GHC settings文件。(基本上,所有内容都安装在/usr/lib/ghc您的安装目录下或安装的等效目录下。)
Reid Barton 2015年

2
我认为@MichaelFox静态链接GHC API不适用于GHC 7.8中引入的新动态链接器。(交互式代码执行现在需要动态库)
bennofs 2015年

2
@bennofs如果您稍微改写一下,看来您的评论几乎是一个答案!
sclv

Answers:


2

附带的可执行文件Language.Haskell.Interpreter似乎与您所显示的方式完美匹配。您必须将自己设置PATH为要执行的脚本。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.