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).

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top