LINUX.ORG.RU

[ocaml] ocaml <--> c

 


0

0

день добрый.

вопрос возник.

имею конструкции вида:

ocaml: type = Item1 | Item2 | Item3;; let item = Item1;;

C: #define item1 1 #define item2 2 #define item3 3

struct st { item; // соответственно 1, 2 или 3 };

хочу я их передавать из ocaml в C и обратно. в оф. доке пишут, что в принципе их можно все пронумеровать, и обращаться в С буквально как к массиву по номерам, но проблема в том, что у меня это не ограничивается 3-мя полями. и вложенность далеко не линейная... и вообще, если я что-то поменяю в типах окамля, потом не разгребу...

можно наделать функций для заполнения конкретного поля конкретной структуры. думаю их можно даже сгенерить. но это имхо тоже... мягко говоря не фонтан.

гугл что-то ничего внятного не говорит.

может быть кто-то сталкивался с необходимостью передавать типы окамля в соответствующие структуры С для обработки? или есть более другой метод? :)

виноват, забыл про форматирование...

имею конструкции вида:

ocaml:
type = Item1 | Item2 | Item3;;
let item = Item1;;

C:
#define item1 1
#define item2 2
#define item3 3

struct st {
  item; // соответственно 1, 2 или 3
};

хочу я их передавать из ocaml в C и обратно.
в оф. доке пишут, что в принципе их можно все пронумеровать, и
обращаться в С буквально как к массиву по номерам, но проблема в
том, что у меня это не ограничивается 3-мя полями. и вложенность
далеко не линейная... и вообще, если я что-то поменяю в типах
окамля, потом не разгребу...

можно наделать функций для заполнения конкретного поля конкретной
структуры. думаю их можно даже сгенерить. но это имхо тоже... мягко
говоря не фонтан.

гугл что-то ничего внятного не говорит.

может быть кто-то сталкивался с необходимостью передавать типы
окамля в С для обработки? или есть более другой метод? :)

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

Не совсем понятна проблема. Вроде в мануале достаточно подробно разжевано на какие кнопули давить чтобы туда-сюда между caml-ом и си данные гонять http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html. Раздел "18.3 Representation of Caml data types". Или я не прав ?

Burbaka ★★
()
Ответ на: комментарий от Burbaka

там не написано что делать, если у меня развесистые типы. опираться просто на порядок следования имхо ересь. если я переопределю

type t = T1 | T2 | T3

в

type t = T1 | T3 | T2

то потом я офигею в сишных сырцах это дело искать и менять.

вообще этот момент имхо как-то не очень продуман.

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

На практике не сталкивался, но вроде значение, соответствующее тегу варианта, расчитывается как hash_variant("T1"), hash_variant("T2"), hash_variant("T3"). Значение зависит от названия тега, но не от его порядка.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

ocaml:
type t1 = T1;;
type t2 = {t:t1};;
type t3 = {t:t2};;

читаем это дело в С:
value t1 = Field (param, 0);
value t2 = Field (t1, 0);
value t3 = Field (t2, 0);

и что-то более другого способа я не вижу...

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Burbaka

> А что не устраивает то ?

привязка к последовательности. стоит пропустить/перепутать один такой field (а у меня их ...эээ... много :) ), и у меня все как минимум поедет. а мне этого ну никак не хочется...

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

Пожалуй единственный способ решить проблему синхронизации изменений в типах данных использовать какой-то автоматический генератор, который по caml-программе генерил соответствующий биндинг на си. Готовой тулзы я ранее не встречал, если найдешь - скажи :) Можно попытаться самому написать такую. Например, по выхлопу ocaml -dparsetree или средствами camlp4

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