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モジュールは時期尚早に削除されました)。
ええ、それは私がやったことです。ありがとう! – gatoatigrado