AFAICT,在这一点上,c2hs用户仍然在编写他们自己的编组函数。不幸的是,marshallers必须是名称,而不是任意表达式,因此您不能在c2hs声明中使用fromIntegral . fromEnum
作为编组。
目前我自己编写marshallers并将它们包含在.c2hs文件中。这里有一些来自我的更复杂的绑定的marshallers。我发现withObject
的情况特别令人不安,但不是那么多,所以我试图自己修复它。
cIntToEnum :: Enum a => CInt -> a
cIntToEnum = toEnum . fromIntegral
cIntFromEnum :: Enum a => a -> CInt
cIntFromEnum = fromIntegral . fromEnum
cIntConv :: (Integral a, Num b) => a -> b
cIntConv = fromIntegral
cFloatConv :: (Real a, Fractional b) => a -> b
cFloatConv = realToFrac
-- |since c2hs doesn't allow "with" as an input marshaller,
-- withObject is a synonym.
withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
withObject = with
withFloatArray :: (Storable b, RealFloat b, RealFloat a) =>
[a]
-> (Ptr b -> IO b1)
-> IO b1
withFloatArray = withArray . map (cFloatConv)
可以说,其中很多应该被提取出来并放到一个共同的库中。如果它与c2hs软件包捆绑在一起,那将是完美的(恕我直言,C2HS模块被过早地移除了)。
是的,这就是我所做的。谢谢! – gatoatigrado 2012-02-28 19:35:01