2012-02-27 4 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、この時点では、ユーザーは自分のマーシャリング機能を書き留めています。残念なことに、マーシャラーは任意の式ではなく名前でなければならないため、fromIntegral . fromEnumをc2hs宣言内のマーシャラーとして使用することはできません。

現在、私はマーシャルを自分で作成し、.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パッケージにバンドルされていれば、それは完璧なものになるでしょう(IMHOのC2HSモジュールは時期尚早に削除されました)。

+0

ええ、それは私がやったことです。ありがとう! – gatoatigrado

関連する問題