2012-02-27 28 views
3

我想使用cFromEnum函数,但是这个函数存在于C2HS模块中,我告诉我这是不必要的,不应该解压/安装(c2hs not getting installed/registered correctly)。什么是转换枚举的现代方式?具体来说,这是我的代码。什么是访问C2HS编组功能的现代方式?

{# enum BNType {underscoreToCase} deriving (Show, Eq) #} 
{# pointer *NodeVector newtype #} 
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #} 

get_nodes_by_type最终会采取一个参数,我只是想获得一些工作现在)。

回答

1

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模块被过早地移除了)。

+0

是的,这就是我所做的。谢谢! – gatoatigrado 2012-02-28 19:35:01

相关问题