Boost.Python permet d'exporter à l'aide d'une chaine de caractères et de l'adresse d'une fonction une fonction C++ vers Python.

Je voudrais faire pareil pour OCaml, et là je bute justement sur cette partie.
Pour OCaml, si je veux exporter une fonction, il faut définir explicitement une fonction en extern "C".

Je me demandais si Boost.Python avait eu le même problème, et comment il l'avait résolu.

Je me dis qu'avec un peu de méta-programmation + des macros c'est possible d'arriver à ses fins, mais en même temps l'évaluation des macros à lieu avant celle des classes templates, donc je me dis que c'est voué à l'échec.

J'ai fouillé un peu le code de Boost.Python et l'exportation d'une fonction se fait effectivement à l'aide d'une vraie fonction C++.

De même, j'ai cru comprendre que l'API C de Python permet de créer les fonctions de manière dynamique à l'aide fonctions libres qui prendraient en argument une structure, mais j'suis pas sûr...

-----

Comment vous auriez fait, vous ?

Il faut savoir que du côté d'OCaml, on importe du C uniquement des fonctions , de manière explicite dans le code source, en indiquant la signature, ainsi que le nom de la fonction C, et ensuite on compile en fournissant le code objet.

Là je vois que deux possibilités pour ne pas avoir à recourir à des choses manuelles :

  • le plus facile à implémenter : écrire un type abstrait du coté de OCaml pour représenter les fonctions sous forme de n-uplets fonction * donnée... Le truc c'est qu'il faudrait prévoir plusieurs version de ces types en fonction de l'arité des fonctions considérées.
    Plus besoin de macros, mais je crains pour les performances côté OCaml, et de plus il faudrait prévoir beaucoup de fonctions auxiliaires pour rendre la manipulation facile.
  • faire plutôt faire des macros qui génère un extern "C" avec le code correspondant, plus toutes les classes templates nécessaires à la surcharge du code. Pour vérifier que le nombre d'arguments correspond bien et d'autres choses, des BOOST_STATIC_ASSERT placés stratégiquement peuvent largement suffire.


Ou alors vous arrivez à faire de la magie avec Boost.Preprocessor et vous me dîtes comment

Je remercie d'avance ceux qui m'auront lu attentivement jusqu'au bout.