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