LINUX.ORG.RU

Импорт структур из C/C++ в хаскель с учетом в GC

 , ,


0

4

Меня интересует импорт С и С++ структур в Хаскель Я знаю 1 способ это сделать:

struct a{
    int f1;
    int f2;
};
typedef struct a A;

A* makeA(int f1, int f2){
    A* p = malloc(sizeof(A));
    p -> f1 = f1;
    p -> f2 = f2;
    return p;
}
А потом в Хаскеле
foreign import ccall safe "makeA" c_makeA :: CInt -> CInt -> IO (Ptr())

newtype AStruct = A (Ptr ())

makeA :: Int -> Int -> IO AStruct
makeA a b = fmap A $ c_makeA (fromIntegral a) (fromIntegral b)
-- bla bla bla
Недостаток этого метода в том, что во-первых надо явно освобождать память за каждой структурой, во-вторых что бы не возникало проблем с ленью, функцию-конструктор надо оборачивать в монаду IO. Есть ли способ плодить структуры так, что бы их мог отслеживать сборщик мусора?

★★★★★

Есть ли способ плодить структуры так, что бы их мог отслеживать сборщик мусора?

ForeignPtr

fmap
()

ForeignPtr/resourcet. При импорте FFI функций их можно не оборачивать в IO на свой страх и риск.

qnikst ★★★★★
()

и на вообще делать:

data AStruct = AStruct Int Int

instance Storable AStruct

если лень писать много кода, то использовать c2hs, chs2hs.

qnikst ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.