On Sat, Aug 27, 2011 at 4:10 PM, Luís Oliveira <luismbo@gmail.com> wrote:
On Sat, Aug 27, 2011 at 7:39 PM, Liam Healy <lhealy@common-lisp.net> wrote:
>> What kind of translation do you need these methods to do on
>> FOREIGN-STRUCT-TYPE?
>>
> They should take the lisp object, allocate the foreign structure, then
> define the slots correctly (recursively if necessary), and return the
> pointer.  For the return pointer, they should read the contents and generate
> the lisp equivalent.  I suppose the calls to libffi functions should invoke
> translate-*-foreign just like it now invokes the functions on the properties
> fsbv::foreign-object-components and fsbv::setf-foreign-object-components.

That seems to fit the translation-*-foreign pretty well. Moreover, it
seems like there should be no default conversion, i.e., you could pass
structures by value using the same code you currently use for passing
structures by reference:

 (with-foreign-object (foo 'some-struct-type)
   (bar foo))

The only difference is that BAR's first argument would be defined to
be a structure argument passed by value. It's a bit subtle. Not sure
how sensible it would be. An alternative would be represent structure
values (as opposed to structure pointers) using some kind of wrapper
object. Any thoughts?

So you're suggesting retaining the :constructor and :deconstructor arguments to defcstruct?    It seems like a custom translate-*-foreign may be more compatible with existing CFFI, though I guess a compatibility expansion might be convenient.

For a default conversion assuming a structure on the lisp side, I'm not sure how to iterate over the structure.  Maybe MOP has something?  I do have iterate-foreign-structure.   If I assume a list or vector on the lisp side, then I could iterate through it. 

If I define a specializer for a particular cstruct, what should the class be?  This looks like a type name, not the actual object that's passed as the second argument 'type, so I presume it should be an eql specializer on the name, but I admit I'm getting confused by this.  In any case I think the :class option to defcstruct won't always work because it does a defclass, I need something like :existing-class that would just do a find-class.

Does any of this make sense?

Liam


--
Luís Oliveira
http://r42.eu/~luis/