Dmitry Bely wrote: > I have a C library function with interface like following: > > typedef [abstract] void* SomeType; > typedef int (*CallBack)(int); > void convert( SomeType* in, SomeType* out, CallBack c); > > It would be nice to use it in caml the following way: > > external convert: someType->someType->(int->int)->unit = "something" > ... > convert stIn stOut ((+) 1) > ... > > Unfortinately CamIDL language does not allow the pointer to function as a > valid type, but maybe there is some common solution/workaround for this > problem? Or the only way is writing necessary stubs and conversion > functions by hands? Is is possible at all? > It is possible to call back caml code from a C code which was called from caml, but you need to write a few lines of code. here is an example extracted from my application (with a few simplifications). the resulting caml function iter_tree can be called recursively, it can also raise exceptions. Another possible solution was proposed in a previous mail by Thierry Bravier, if you want to use C++ http://caml.inria.fr/bin/wilma_hiliter/caml-list/199704/msg00029.html Eric Nassor ------------------------------------------------------------- in the original C library typedef tree (*walk_tree_fn) (tree *, void *); /* walk_tree iters on the tree data structure and calls the function func with the current tree value and the data */ tree walk_tree (tree *tp, walk_tree_fn func, void *data) ------------------------------------------------------------- in C_to_ml interface /* * intermediary function called by walk_tree * it calls the caml callback function which is given as argument */ static tree iter_tree_func(tree * t,void * fun) { CAMLparam0(); CAMLlocal1(tr); /* if you want to stress the memory system */ /* Garbage_collection_function() ;*/ tr = camlidl_c2ml_type_tree(t,NULL); callback(*(value *)fun, tr); CAMLreturn(NULL_TREE); /* caml exceptions are used if needed instead of return values */ } /* * function to apply walk_tree to a CAML function */ value iter_tree (value v_function, value v_tree) { CAMLparam2(v_tree, v_function); tree t ; camlidl_ml2c_type_tree(v_tree,&t,NULL); /* v_function is protected but its value may change because of the gc so we have to take the address */ walk_tree(&t, iter_tree_func, &v_function); CAMLreturn (Val_unit); } camlidl_ml2c_type_tree and camlidl_c2ml_type_tree are generated by camlidl to translate tree between C and caml ------------------------------------------------------------- in the caml code external iter_tree : (tree -> unit) -> tree -> unit = "iter_tree" -------------------------------------------------------------