我想使用cFromEnum
函数,但是它驻留在C2HS
模块中,我被告知这是不必要的,不应解压/安装(c2hs not getting installed / registered correctly)。转换枚举的现代方法是什么?具体来说,这是我的代码。
{# enum BNType {underscoreToCase} deriving (Show, Eq) #}
{# pointer *NodeVector newtype #}
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #}
(
get_nodes_by_type
最终会引起争论;我现在正试图使某些事情起作用)。 最佳答案
AFAICT,此时c2hs用户只能编写自己的编组功能。不幸的是,封送处理程序必须是名称,而不是任意表达式,因此您不能在c2hs声明中将fromIntegral . fromEnum
用作封送处理程序。
目前,我自己编写了编组器,并将它们包括在.c2hs文件中。这是我比较复杂的绑定之一中的一些编组器。我发现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模块)。