Hi, What exactly is the current state of non-top level callbacks for CFFI? Something like:
(let ((x 10)) (defcallback mycallback ....))
What platforms/implementations support this? The manual only says "some Lisps". Also, is there anything analogous to lambda for defcallback?
regards, Tomas.
On Sun, 2007-05-20 at 19:39 -0700, Tomas Melchior wrote:
What platforms/implementations support this? The manual only says "some Lisps". Also, is there anything analogous to lambda for defcallback?
To refer to the text:
*Portability note:* `defcallback' will not work correctly on some Lisps if it's not a top-level form.
The point of this note is to say that CFFI doesn't guarantee that it will work, much as doing anything not defined by ANSI Common Lisp isn't guaranteed to work in portable Common Lisp code. In fact, "some" may mean "none at all" now or at any future time. In other words, don't do it.
Please see Tutorial-Callbacks in the manual for a trivial workaround to get closures to run due to callbacks. You may not like it though.
Stephen Compall wrote:
On Sun, 2007-05-20 at 19:39 -0700, Tomas Melchior wrote:
What platforms/implementations support this? The manual only says "some Lisps". Also, is there anything analogous to lambda for defcallback?
To refer to the text:
*Portability note:* `defcallback' will not work correctly on some Lisps if it's not a top-level form.
The point of this note is to say that CFFI doesn't guarantee that it will work, much as doing anything not defined by ANSI Common Lisp isn't guaranteed to work in portable Common Lisp code. In fact, "some" may mean "none at all" now or at any future time. In other words, don't do it.
I wonder if we even want to word this more strongly and outright declare the results undefined or implementation-defined if at non top-level.
DEFCALLBACK is one place that we compromise and pass through to the Lisp's underlying DEFCALLBACK macro, instead of using a functional interface. Unfortunately, this can allow implementation details to leak through, as it does in this case.
I would love to see all supported Lisps providing the underlying machinery to make a CALLBACK-LAMBDA happen, but I think the number is currently quite low. :( I did write a patch awhile back adding this for (IIRC) SBCL and CLISP. It should be in the cffi-devel list archives.
With a widely supported CALLBACK-LAMBDA, we could implement DEFCALLBACK in terms of CALLBACK-LAMBDA, as we do with DEFCFUN and FOREIGN-FUNCALL. I'd like to hope we can get there someday...
James