[Openmcl-devel] :address ffi type spec

Gary Byers gb at clozure.com
Wed Aug 25 06:54:51 PDT 2004

On Wed, 25 Aug 2004, Marco Baringer wrote:

> Gary Byers <gb at clozure.com> writes:
> >
> > :ADDRESS is supposed to be shorthand for (:* :void); it doesn't make
> > sense to give :ADDRESS an argument, and I'd hope that something, somewhere
> > would complain about that.
> the docs suggest using (:* t), are these the same thing or are there
> times when i'd want one instead of the other? empricial evidence
> shows that (:* t) works fine for void *.

(:* t) and (:* :void) mean about the same thing, but they (currently)
don't map to exactly the same internal representation.  (I can't think
of a significant difference between those different internal
representations.)  Currently, (:* t) is roughly "pointer to nothing",
while (:* :void) is "pointer to :VOID, where :VOID is a foreign type
that you can't do much with except point to an 'instance' of it ...".

That distinction's pretty obscure; at the moment, I can't think of
a good reason for "pointer to nothing", and think that (:* t) should
be parsed as if it were (:* :void).   For all intents and purposes,
the two types are equivalent, but currently if you do:

? (def-foreign-type nil
     (:struct :x
              (:xptr (:* t))))

and later do:
? (def-foreign-type nil
      (:struct :x
               (:xptr (:* :void))))

you'll get a redefinition warning.  (This is about the only case I can
think of where anything would see (:* t) and (:* :void) as distinct;
they aren't effectively distinct, but differ enough in their
implementation details to confuse the code that issues the warning.)

To answer your question: I think that it'd be better for UFFI to use
(:* :VOID), and for (:* T) to be changed to be "exactly the same as
(:* :VOID)", instead of "semantically identical but implemented
differently", as it currently is.

More information about the Openmcl-devel mailing list