Quelle est la manière moderne d'accéder aux fonctions de triage C2HS ?
Question
Je veux utiliser le cFromEnum
fonction, mais cela réside dans le C2HS
module, dont on me dit qu'il est inutile et ne devrait pas être décompressé/installé ( c2hs n'est pas installé/enregistré correctement ).Quelle est la manière moderne de convertir une énumération ?Pour plus de concret, voici mon code.
{# enum BNType {underscoreToCase} deriving (Show, Eq) #}
{# pointer *NodeVector newtype #}
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #}
(get_nodes_by_type
finira par accepter un argument ;J'essaie juste de faire fonctionner quelque chose pour le moment).
La solution
AFAICT, à ce stade, les utilisateurs de c2hs doivent écrire leurs propres fonctions de marshalling.Malheureusement, les marshallers doivent être des noms et non des expressions arbitraires, vous ne pouvez donc pas utiliser fromIntegral . fromEnum
en tant que marshaller dans le cadre d'une déclaration c2hs.
Actuellement, j'écris moi-même des marshallers et je les inclut dans le fichier .c2hs.Voici quelques marshallers d'une de mes fixations les plus compliquées.Je trouve la situation pour withObject
particulièrement exaspérant, mais pas au point que j'ai déjà essayé de le réparer moi-même.
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)
On peut soutenir que bon nombre d’entre eux devraient être extraits et placés dans une bibliothèque commune.S'il était fourni avec le package c2hs, ce serait parfait (à mon humble avis, le module C2HS a été supprimé un peu prématurément).