LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

я где-то вычитал упоминание, что, мол, c2hs скриптабельный сам по себе

Если считать

#include "test.h"

{# pointer *Foo as FooPtr -> Foo #}

data Foo = ...

instance Storable Foo where ...

#c
int my_foo(Foo *s) { return foo(*s); }
#endc

withFoo :: Foo -> (FooPtr -> IO a) -> IO a
withFoo = with

{# fun my_foo as foo { withFoo * `Foo' } -> `Int' fromIntegral #}

в *.chs файле с последующим mv *.chs.h -> *.chs.c для передачи *.chs.c в ghc --make. Всё равно руками приходится делать.

Говорят, hsc2hs устроен по-другому, он генерирует сишные файлы. Может в нём данная проблема обойдена?

Насколько я видел при использовании hsc2hs foreign import пишут руками, но может не всё видел.

Ещё можно на libffi посмотреть — общелисповая cffi реализует передачу и возврат структур по значению с её помощью (у реализаций CL с этим тоже проблемы).

Исходная версия quasimoto, :

я где-то вычитал упоминание, что, мол, c2hs скриптабельный сам по себе

Если считать

#include "test.h"

{# pointer *Foo as FooPtr -> Foo #}

data Foo = ...

instance Storable Foo where ...

#c
int my_foo(Foo *s) { return foo(*s); }
#endc

withFoo :: Foo -> (FooPtr -> IO a) -> IO a
withFoo = with

{# fun my_foo as foo { withFoo * `Foo' } -> `Int' fromIntegral #}

в *.chs файле с последующим mv *.chs.h -> *.chs.c для передачи *.chs.c в ghc --make. Всё равно руками приходится делать.

Говорят, hsc2hs устроен по-другому, он генерирует сишные файлы. Может в нём данная проблема обойдена?

Насколько я видел при использовании hsc2hs foreign import пишут руками, но может не всё видел.

Ещё можно на libffi посмотреть — общелисповая cffi реализует передачу и возврат структур по значению с её помощью.