大家好,现在是你当地的时间。
我阅读了《Real World Haskell》关于Foreign Function Interface的章节,并在这里做了一些后续阅读。我正在尝试绑定C函数,并希望对某些事情进行澄清。
以下内容相当清晰明了:
foreign import ccall unsafe "math.h sin" c_sin :: CDouble -> CDouble
我可以在ghci中加载它并使用相应的编码,一切都很好。它甚至可以在emacs的Haskell模式的嵌入式ghci中加载,这对于测试非常有用。
math
是一个系统库,所以这很简单。现在是《Real World Haskell》中的一个例子:
foreign import ccall unsafe "pcre.h pcre_compile" c_pcre_compile :: ...
我故意省略了函数签名的其余部分。现在,我无法在Haskell模式下加载它。我看到的所有示例都说必须这样做:
ghci -lpcre
我进行了操作,并立即得到确认,表明事物正在正确加载:
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading object (dynamic) /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../lib/libpcre.so ... done
final link ... done
我可以加载我的绑定代码并进行测试,但是...
问题1 我能否在ghci中加载非系统库,例如pcre?这将允许我在emacs中进行测试。
接下来。 当我尝试编写对我的自己的 C 代码的绑定时,事情变得更加复杂。
foreign import ccall unsafe "myprint.h myprint" c_myprint :: CString -> IO ()
毋庸置疑,这是一个相当无意义的函数。它接收来自Haskell的ByteString并用C语言打印出来。下面是一个简单的测试文件:
{-# LANGUAGE ForeignFunctionInterface #-}
-- printTest.hs
import Foreign
import Foreign.C.Types
import Foreign.C.String
import qualified Data.ByteString.Char8 as B
---
foreign import ccall unsafe "myprint.h myprint" c_myprint :: CString -> IO ()
---
main = B.useAsCString (B.pack "Tempura is great!") c_myprint
我通过以下方式编译成功:
ghc --make myprint.c printTest.hs
我得到了一个可执行文件,但是我根本无法在ghci中加载它。这严重拖慢了测试过程。
问题2:我需要做什么才能在ghci中加载与我的C代码绑定的Haskell代码?没有任何主要的FFI信息来源提供了相关信息。无论如何调整ghci -L都无法让它正常工作。
请帮忙提供任何可以提供的帮助,谢谢。