On Wed, 2007-03-14 at 17:03 +0000, Luis Oliveira wrote:
Peter Seibel peter@gigamonkeys.com writes:
Other than keeping my own integer->object mapping and passing the integer to C and translating it back to the object when I get it back, is there some easier way to do this in CFFI?
Hmm, since you're asking whether this is doable in *CFFI*, the answer is no then. :-) You can, however, make good use of CFFI's type system!
If the use case is passing Lisp data to callbacks limited to a certain dynamic extent, you could do this easily by consing bindings from ints to Lisp objects on an association list... Something like:
;;; Counter used to generate unique IDs for Lisp objects passed to ;;; foreign code. The counters are only guaranteed to be unique ;;; during the dynamic extent of which they are bound. (defvar *lisp-object-counter* 0)
;;; Association list of Lisp object IDs to Lisp objects. (defvar *lisp-objects* nil)
;;; Create a binding for a unique ID to a Lisp object during the ;;; extent of BODY. The ID may be coerced to a pointer and passed to ;;; foreign code, then looked up from callback functions. (defmacro with-lisp-object-id ((id object) &body body) `(let* ((,id *lisp-object-counter*) (*lisp-object-counter* (1+ *lisp-object-counter*)) (*lisp-objects* (acons ,id ,object *lisp-objects*))) ,@body))
Then you can pass the IDs as pointers to functions that take a callback and user data pointer, and ASSOC them in *LISP-OBJECTS* inside the callback.
James