2015-01-04 1 views
3

При использовании c2hsc и hsc2hs сэкономит мне много работы, я столкнулся с некоторыми проблемами при попытке создания привязок для C-соединений.Взаимодействие с C-соединениями в Haskell через c2hsc и hsc2hs


Например, учитывая структуру C

typedef struct { 
     int tag; 
     union { 
      char a; 
      double b; 
     } v; 
} sum_t; 

c2hsc создает следующий код для меня:

#starttype sum_t 
#field tag , CInt 
#field v , 
#stoptype 

где v поле генерируется пустым. Двигаясь дальше вниз инструментарием, с помощью hsc2hs дает неправильные

data C'sum_t = C'sum_t{ 
    c'sum_t'tag :: CInt, 
    c'sum_t'v :: 
} 

Вопросы теперь

  1. Что такое правильный способ, чтобы написать .hsc код вручную, так что я могу работать с креплениями?
  2. Есть ли способ, который я могу сделать c2hsc сделать это автоматически?
+3

Учитывая, что кодовая база 'hsc2hs' вообще не упоминает о союзах, я подозреваю, что она не реализована. Кроме того, союзы по своей сути являются небезопасными, поэтому неясно, как можно перевести их в алгебраические типы данных. Чтобы сделать это безопасно, нужен также дискриминатор, который является сущностью вне союза. – Rufflewind

+0

Лучше всего будет написать функции для создания и управления ими в C самостоятельно, а затем использовать их со стороны Haskell. Но я ничего не знаю о FFI. – dfeuer

ответ

0

c2hsc только что генерирует bindings-dsl макросы. Используя documentation there, вы сможете выяснить, как их записать. Рассмотрим что-то вроде ...

#starttype struct sum_t 
#field tag , CInt 
#field v.a , CChar 
#field v.b , CDouble 
#stoptype 

в документации по goes on to describe, как манипулировать союзы с использованием указателей.

 Смежные вопросы

  • Нет связанных вопросов^_^