The use of define-foreign-type creates secret global variables with
gensymed names which are used to wrap around the argument conversion
functions.  Two such names are created for each define-foreign-type form
(indeed, if the optional RETCONVERT is not provided, a global is still
created to hold it which ends up doing (values) instead of calling
something).  See the code in compiler.scm which canonicalizes a
define-foreign-type form.

The problem is that if you define a foreign type but don't happen to use
one of the conversions in the actual code, you get a spurious "global
variable `g862' is never used" warning.  Of course you can make this go
away with (declare (disable-warning var)), but that's overkill.  I do
want warnings, just not spurious ones.  Normally it is useful to do
(declare (unused ...)) but that doesn't work here, because the variables
created have secret gensymed names.

I think that this could be avoided if, for example, foreign types were
treated as first class objects.  All the existing syntax could be
preserved.  Define-foreign type would no longer be a special case; it
could just be
(define-syntax define-foreign-type
  (syntax-rules ()
    ((_ name type argconvert) (cons argconvert values))
    ((_ name type argconvert retconvert) (cons argconvert retconvert))))

Or something like that; I'm no expert on this area of the system.

Perhaps, indeed, it might be fully sufficient to use a "mark" in the
compiler, to mark the magical gensymed variables as used (the way they
are currently marked with the 'always-bound tag).

Thomas





_______________________________________________
Chicken-hackers mailing list
Chicken-hackers@nongnu.org
http://lists.nongnu.org/mailman/listinfo/chicken-hackers

Reply via email to