Am 07.05.2006 um 00:50 schrieb James Bielman:

Frank Goenninger <[EMAIL PROTECTED]> writes:

I do habe C structs lile these:

struct a_struct
{
    int a;
};

struct b_struct
{
   int b;
   struct a_struct a;
};


How would I model b_struct using defcstruct ?

It looks like what you would think:

(defcstruct a-struct
  (a :int))

(defcstruct b-struct
  (b :int)
  (a a-struct))

Hmmm - didn't think of this because I seem to have read something along the lines of what you say:

It's confusing, because CFFI tries to avoid passing aggregate C
objects by value.  For instance, if you declare a function argument as
having type A-STRUCT, you get a pointer instead, because you can't
pass structures by value in CFFI.

But in a structure, you do need to able to include a structure, not
just a pointer to it.  So the obvious thing does what you want.

Anyway: Thanks!


In retrospect, the foreign type A-STRUCT should probably always mean
the structure itself by value, and declaring a function like:

(defcfun struct-by-value :void
  (a a-struct))

should probably just be an error, instead of the DWIM-ish behavior of
canonicalizing A-STRUCT to :POINTER.

It certainly would be more puristic and IMHO clean.

  (And someday the Lisp
implementations may be extended to pass structures by value, and we
will want to support that.)


Ideally, :POINTER should probably become a parameterized type, so that
function would instead be:

(defcfun struct-by-pointer :void
  (a (:pointer a-struct))

which will help us down the road when we implement optional pointer
type checking.

Which I'd prefer also ! Let's you not only do type checking but is what I need most: As close to C as it can get. I'd have some translate-from/to-foreign functions specializing on the pointer type rather than defining a new type and dispatching on that.


Any thoughts?  This would be a pretty incompatible change, but it's
probably better to fix it soon then let more code get written that
takes advantage of this (IMHO) misfeature.

James

I certainly can live with the current implementation! It's just that I need sometimes a heads-up to get my head to think the CFFI way..

Thx!

Frank

_______________________________________________
cffi-devel mailing list
cffi-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel

Reply via email to