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/