2012-02-27 68 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

相關問題