Добрый вечер.
Возникла необходимость получить в своё распоряжение возможность работать с Clutter из Swi-Prolog (т.е., вызывать сишный код). До этого написанием биндингов никогда не занимался, поэтому возник ряд вопросов. Но прежде чем задавать их, в двух словах расскажу о том, что из себя представляет Swi'шный FFI, чтобы было понятнее, что мне нужно.
Swi-Prolog позволяет напрямую обращаться к функциям из специально заготовленных *.so, например:
#include <SWI-Prolog.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
foreign_t pl_lowercase(term_t u, term_t l)
{
printf("%d\n", count);
count++;
char *copy;
char *s, *q;
int rval;
if (!PL_get_atom_chars(u, &s))
return PL_warning("lowercase/2: instantiation fault");
copy = malloc(strlen(s) + 1);
for (q = copy; *s; q++, s++)
*q = (isupper(*s) ? tolower(*s) : *s);
*q = '\0';
rval = PL_unify_atom_chars(l, copy);
free(copy);
return rval;
}
install_t install()
{
PL_register_foreign("lowercase", 2, pl_lowercase, 0);
}
Как видно, Swi-Prolog работает только с функциями, которые возвращают и принимают специальные типы.
Выражаясь по русски, для каждой «обычной функции» мне нужно написать небольшую обёртку, которая будет преобразовывать прологовские типы в сишные и обратно. Ничего сложного, но много ручной работы.
А теперь вопросы:
- Правильно ли я понимаю, что сегодня никто руками биндинги не пишет, и всё (или почти всё) генерируется автоматически?
- Если да, то как это делается? На данный момент у меня идея такова - составить нечто вроде БД всех Clutter'овских функций, структур, итп., и уже по ней генерировать нужный мне *.so.
- Если остальные используют схожий подход, значит ли это, что такие БД уже должны быть собраны до меня, и мне останется лишь их вежливо попросить у разработчиков Clutter или биндингов к нему?
- «Обернуть» функции довольно тривиально (если не считать всяких variable argument lists, итп). Как быть с макросами?
- Есть ли готовые работы, от которых можно было бы оттолкнуться?
- Есть ли что либо почитать по этой теме?
Любые другие мудрые советы приветствуются.