如何用Language.Haskell.Interpreter发布可执行文件?
我希望能够使用hint
来embedded一个Haskell解释器,这样我就可以在Haskell中编写插件来与我的程序一起使用。 我不想为我的可执行文件运送该死的Haskell平台。 通常,Haskell可执行文件是相当独立的。 例如,擦除PATH
不会导致问题:
$ PATH=. Hello Hello world
但是,如果我擦除PATH
使用runInterpreter
炸弹一个简单的testing程序:
$ 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
的testing代码没有太多的作用:
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 fx = x + 1
使用Language.Haskell.Interpreter
发送可执行文件似乎与您所显示的方式一致。 您必须将您的PATH
设置为您要执行的脚本。
另外,正如注释中的@bennofs所提到的,静态链接GHC API不能与GHC 7.8中引入的新dynamic链接器(交互式代码执行现在需要dynamic库)一起工作。