[Openmcl-devel] docs on using external-call?

Gary Byers gb at clozure.com
Mon Jun 5 16:24:58 PDT 2006

On Mon, 5 Jun 2006, Kaveh Kardan wrote:

> I am calling a C++ library from OpenMCL.  ffigen will not generate
> the interface for a C++ header file, even for functions (the .ffi
> file is created, but no cdb fils are generated).
> This means I have to use external-call, for which I cannot find many
> examples.
> One thing I would like to be able to do is pass a lisp callback to a C
> ++ function, much like is done with:
> (#_glutDisplayFunc display-cb)
> But if I try something like:
> (external-call "_my_func" :function #'display-cb :void)
> I get an error.
> What is the correct way of doing this?

If one does:

(defcallback my-func (...) ...)

tnen the value of the global variable MY-FUNC will be a MACPTR to some
address (DEFCALLBACK has stored a little bit of machine code at that address.)
One can use that MACPTR to pass the address of that little block of code
to a foreign function that expects a "pointer to function" as an argument

(#_foreign-function-that-wants-function-address my-func)

Note that (DEFCALLBACK MY-FUNC ...) doesn't affect the function cell of
the symbol MY-FUNC at all; it's actually hard (I never remember how)
to get one's hands on the lisp function that's eventually called.

> And are there more detailed
> examples of using external-call documented somewhere?

There aren't even too many uses of EXTERNAL-CALL in the OpenMCL sources/

Whether it uses EXTERNAL-CALL or #_ or whatever, something demonstrating
how callback pointers can be passed to foreign functions (your basic
question) would make a good example.

> Regards,
> Kaveh

> Kaveh Kardan                 Chief Technologist
> kaveh at hawaii.edu             Academy for Creative Media
> (808)956-5302                University of Hawaii
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel

More information about the Openmcl-devel mailing list