On Wed, Nov 5, 2014 at 7:53 AM, FAU <f...@riseup.net> wrote:
> Is there a reliable/portable way to have lambdas called as a callback 
> from a foreign C function?  I assume there's not though.

The CLISP FFI has had lambda callbacks since FFI day 1, 20 years ago, as well 
as other implementations.

The issue with callbacks in CFFI is IMHO one of proper resource deallocation. 
No one AFAIK has devised a KISS-style lambda callback creation *AND 
DEALLOCATION* protocol. The reason why deallocation is important is that every 
lambda callback needs dynamic creation of what the CLISP libffi and GCC call a 
trampoline. The Lisp system cannot itself determine when the callback 
trampoline is not needed anymore, so the application MUST tell it.

Various Lisp implementation have baroque restrictions on the number of 
callbacks (I seem to remember numbers as low as 255 for one). Lambda callback 
makes it trivial to inadvertently create unnumbered callbacks (e.g. reload your 
Lisp source during development, run some function in a loop...) as opposed to 
unique named functions, so the risk of leaking memory is high. The lambda 
callback APIs in existing Lisp implementations differ a lot. These observations 
combined make an attempt at portable lambda callbacks a hairy job.

>I know one of the GTK bindings did something like this, but it used some 
>GTK-specific tricks.
Can't remember about GTK, I may have LTK in memory, and the simple trick was 
that lambda was not actually needed. There was a single callback function from 
the foreign POV, so a unique named function could be used. That Lisp function 
then did some work to identify the actual Lisp callback and supply it with 
useful arguments.

Regards,
        Jörg Höhle
_______________________________________________
Cffi-devel mailing list
Cffi-devel@common-lisp.net
http://mailman.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel

Reply via email to