Может ли in-C на Haskell вернуть typedef к указателю на функцию? - PullRequest
0 голосов
/ 22 января 2019

Я работаю с базой кода C, для которой

typedef void(* wl_notify_func_t) (struct wl_listener *listener, void *data) 

//...

struct wl_listener {
  struct wl_list link;
  wl_notify_func_t notify; //<-- I'd like to return this
};

и использую код Haskell

type NotifyFuncT = FunPtr (Ptr C'WlListener -> Ptr () -> IO ())

initializeMyCtx = C.context $ C.baseCtx <> C.funCtx <> mempty {
  C.ctxTypesTable = Data.Map.fromList [
     (C.Struct "wl_listener", [t|C'WlListener|])
  -- ...
  ,  (C.TypeName "wl_notify_func_t", [t|NotifyFuncT|])
  ]
}

someHaskellFunction :: Ptr C'WlListener -> IO NotifyFuncT
someHaskellFunction ptrToWlListener = do
  funPtr <- [C.block| wl_notify_func_t {return $(struct wl_listener * ptrToWlListener)->notify;}|]
  return funPtr

К сожалению, я получаю ошибку из встроенного кода Cблок, который, по сути, говорит:

unexpected identifier  wl_notify_func_t

Так что же я могу сделать с помощью inline-C?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы используете контексты неправильно.

C.context :: Context -> Q [Dec]

Он должен называться соединением верхнего уровня Template Haskell.Все, что вы сделали, - это определите

intializeMyCtx :: Q [Dec]

. Это действие Q, которое будет инициализировать ваш контекст, если выполнится, но не .Итак, исправьте это:

type NotifyFuncT = FunPtr (Ptr C'WlListener -> Ptr () -> IO ())

C.context $ C.baseCtx <> C.funCtx <> mempty {
  C.ctxTypesTable = Data.Map.fromList [
     (C.Struct "wl_listener", [t|C'WlListener|])
  -- ...
  ,  (C.TypeName "wl_notify_func_t", [t|NotifyFuncT|])
  ]
}

Во-вторых, someHaskellFunction немного сложнее.Если у вас есть более сложная функция, тогда C.block может быть оправдано, но сейчас один C.exp сделает все.

someHaskellFunction :: Ptr C'WlListener -> IO NotifyFuncT
someHaskellFunction ptr = [C.exp| wl_notify_func_t { $(struct wl_listener *ptr)->notify } |]
0 голосов
/ 23 января 2019

Код в моем вопросе работает. Я просто забыл включить контекст C.

...