On Sat, Aug 27, 2011 at 4:10 PM, Luís Oliveira <luis...@gmail.com> wrote:
> On Sat, Aug 27, 2011 at 7:39 PM, Liam Healy <lhe...@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/ >
_______________________________________________ cffi-devel mailing list cffi-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel