【发布时间】:2015-03-28 02:29:30
【问题描述】:
我希望使用hint 嵌入一个 Haskell 解释器,这样我就可以在 Haskell 中编写插件来与我的程序一起使用。我不想为我的可执行文件提供整个 Haskell 平台。
通常,Haskell 可执行文件是相当独立的。例如,删除PATH 不会导致问题:
$ PATH=. Hello
Hello world
但是,如果我删除PATH,使用runInterpreter 的简单测试程序会爆炸:
$ 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
【问题讨论】:
-
我无法重现此问题。当我运行
PATH= ./TryHint时,一切都很顺利:它会打印一些数字,然后退出。我也在使用 GHC 7.8.3。您如何构建TryHint? -
我也相信它可能是特定于 OSX 的。您可能想在 GHC 的 tracker 处开票,如错误消息中所述(毕竟,不可能的确实刚刚发生)。
-
我不知道这个错误是怎么回事,但无论如何,GHC 依赖于很多资源,你没有用
PATH=.隐藏它,例如 Prelude 的接口文件以及它传递导入的所有内容,base 和 ghc-prim 和 integer-gmp 的实际库文件,以及 GHCsettings文件。 (基本上,所有东西都安装在/usr/lib/ghc或您安装的等效目录下。) -
@MichaelFox 静态链接 GHC API 不适用于 GHC 7.8 中引入的新动态链接器,我认为:| (交互式代码执行现在需要动态库)
-
@bennofs 如果您稍微改写一下,您的评论似乎几乎是一个答案!
标签: haskell packaging shipping