Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
announce: callbacks-0.1
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2005-09-08 (21:24)
From: Christophe Raffalli <christophe.raffalli@u...>
Subject: Re: [Caml-list] announce: callbacks-0.1
Maas-Maarten Zeeman a écrit :
> Hello,
>> link: third item of:
>> comment and idea are welcome !
> Sounds like a nice idea. As the author of ocaml-expat a binding I've 
> also worked with c -> ocaml callbacks.
> It is not really clear to me what problem you are trying to solve. It is 
> not very difficult for somebody writing a Ocaml binding to come up with 
> a solution which is easy to call an ocaml function value from c.
> What I did was create one fixed c-callback functions which:
> receive c-parameters
> transform them to ocaml-values
> lookup the ocaml callback "cb" in a tuple (set earlier from ocaml),

This is that step I want to avoid ... not mainly for performance, but 
because there are some cases where you do not know which callback you 
should call (this was the case for one of the glut callback, I don't 
recall which one, and it was a bit tricky for glutTimer). It happens 
that in glut, the current window or current menu is properly set before 
calling the callback ... but there may be other library, more purely 
functional, with no concept of "current window" ...

The other reason, is that it makes it easier to writte the bindings for 
the library (no thinking required and therefore less bug) ! and does not 
make it that much complex for the user.

If you really need "dynamic" callback with arbitrary closure, then you 
can implement your trick above mine in OCaml.

By expending my work, we could write and use bindings for a C library 
like glut without writing a line of C, except to convert data structure 
from C to OCaml if you really need that.

This could divide the size of the glut binding by a factor 2 or 3 ...
which is important !

> apply cb to the ocaml-values,
> etc, etc
> The ocaml programmer just has to deal with normal ocaml callback 
> function values (which can be partially applied, unnamed, etc). These 
> will be stored via c in a tuple. The value pointing to this tuple is 
> registered as 1 global root. If you have large amounts of callbacks it 
> would probably work with a simple hash table too. Then you only have to 
> write/generate 1 c-callback function (per c-signature) which takes care 
> of calling an unlimited amount of caml callbacks.
> Its interesting to have the c-wrapper function generated as it would 
> prevent hard to debug gc problems.
> Regards,
> Maas