Каков современный способ доступа к функциям сортировки C2HS? - PullRequest
3 голосов
/ 28 февраля 2012

Я хочу использовать функцию cFromEnum, но она находится в модуле C2HS, который, как мне говорят, не нужен и не должен быть распакован / установлен ( c2hs неправильно устанавливается / регистрируется *) 1004 *). Какой современный способ конвертировать перечисление? Для конкретности вот мой код.

{# enum BNType {underscoreToCase} deriving (Show, Eq) #}
{# pointer *NodeVector newtype #}
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #}

(get_nodes_by_type в конечном итоге примет аргумент; сейчас я просто пытаюсь заставить что-то работать).

1 Ответ

1 голос
/ 28 февраля 2012

AFAICT, на данный момент пользователи c2hs оставляют свои собственные функции сортировки. К сожалению, маршаллеры должны быть именами, а не произвольными выражениями, поэтому вы не можете использовать 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, это было бы идеально (ИМХО модуль C2HS был удален немного преждевременно).

...