[MLton] Callback to function pointer?
Wesley W. Terpstra
wesley@terpstra.ca
Tue, 12 Jul 2005 15:27:01 +0200
On Tue, Jul 12, 2005 at 08:16:54AM -0400, Matthew Fluet wrote:
> > MLton can already call methods by function pointer, but it cannot export
> > methods _to_ function pointer. Would this be difficult? Many C libraries
> > (especially GUIs and event libraries) use callbacks to C function pointers.
>
> Why do you think that MLton cannot export functions that may be called
> indirectly? An "_export"-ed function is a legitimate C function in the
> object file. If you want a function pointer to that function, take its
> address with "&".
I meant something like this:
fun clicker1 () = print "clicked callback 1!\n"
fun clicker2 () = print "clicked callback 2!\n"
val gui_clicked = _import "gui_clicked": MLton.Pointer.t -> unit;
fun setupclick f = gui_clicked
(_export *: (unit -> unit) -> MLton.Pointer.t; f)
val () = setupclick clicker1
val () = setupclick clicker2
val () = enterTheGuiMainLoop ()
Where the output should be:
clicked callback 1!
clicked callback 2!
when the GUI is clicked, not:
clicked callback 2!
clicked callback 2!
... which is what I'd get if I used a name instead of '*'.
Ie: The same '_export' creates two distinct entry points. I believe _export
normally assigns the last given function to the named symbol. So, you can
change what gets called, but for every _export only one distinct function.
Even if the above behaviour is too hard, being able to get a pointer to an
exported function would be nice. Otherwise, you'll have to have C files
extern void sml_exported_method ();
void* getPtr() { return &sml_exported_method; }
when all you really wanted was to pass the pointer into a C function.
--
Wesley W. Terpstra