[Openmcl-devel] Warning about unused arguments in generic function methods

Hans Hübner hans at huebner.org
Wed Nov 14 12:50:05 PST 2007


The patch I sent certainly is not sufficient, as it fails to find
variables defined after the first lambda-list keyword (&rest, &key
etc).  I'll investigate some more and re-post.

-Hans

On Nov 14, 2007 1:34 PM, Hans Hübner <hans at huebner.org> wrote:
> Currently, you get a warning only for parameters that are implicitly
> specialized to the T class.  If you have an explicit specializer, no
> warning is generated:
>
> CL-USER> (defgeneric foo (a b))
> #<STANDARD-GENERIC-FUNCTION FOO #x300045AFEBDF>
> CL-USER> (defmethod foo ((a t) (b t)) t)
> #<STANDARD-METHOD FOO (T T)>
> CL-USER> (defmethod foo (a b) t)
>
> ;Compiler warnings :
> ;   Unused lexical variable A, in (FOO (T T)) inside an anonymous lambda form.
> ;   Unused lexical variable B, in (FOO (T T)) inside an anonymous lambda form.
>
> Following your suggestion, the following patch may do:
>
> Index: macros.lisp
> ===================================================================
> RCS file: /usr/local/tmpcvs/openmcl-dev/ccl/lib/macros.lisp,v
> retrieving revision 1.118
> diff -c -r1.118 macros.lisp
> *** macros.lisp 15 Oct 2007 04:10:54 -0000      1.118
> --- macros.lisp 14 Nov 2007 12:29:20 -0000
> ***************
> *** 1679,1685 ****
>             (when inner-list
>               (push `(declare ,@(nreverse inner-list)) inner)))))
>       (values (nreverse outer) (nreverse inner))))
> !
>
>   (defun parse-defmethod (name args env)
>     (validate-function-name name)
> --- 1679,1686 ----
>             (when inner-list
>               (push `(declare ,@(nreverse inner-list)) inner)))))
>       (values (nreverse outer) (nreverse inner))))
> !
> ! (defvar *DEFMETHOD-DECLARE-ALL-SPECIALIZED-ARGUMENTS-IGNORABLE* t)
>
>   (defun parse-defmethod (name args env)
>     (validate-function-name name)
> ***************
> *** 1708,1713 ****
> --- 1709,1716 ----
>                           (push `(type ,p ,(%car parameters)) types)))
>                        (t (signal-program-error "Illegal arg ~S" p))))
>                 (t
> +                (when *defmethod-declare-all-specialized-arguments-ignorable*
> +                  (push p refs))
>                  (push p parameters)
>                  (push t specializers-form)
>                  (push t specializers)))))
>
>
>
> On Nov 14, 2007 10:27 AM, Gary Byers <gb at clozure.com> wrote:
> > For a parameter specialized (implicitly or explicitly) to the
> > T class, it might be the case that that parameter is strictly
> > used for discrimination, but it's at least equally likely that
> > it's "just an argument".  For example:
> >
> > (defmethod stream-write-char ((s telnet-stream) char)
> >    s)
> >
> > I think that I would want a warning telling me that I'd forgotten
> > to reference CHAR; if I hadn't referenced S either ... well, it's
> > at least somewhat plausible that the specialized parameter was
> > used for discrimination only (though I think that I'd like to
> > know if I wrote a STREAM-WRITE-CHAR method that didn't reference
> > either of its arguments.)
> >
> > [If I actually -wanted- to ignore the character - as in
> >
> > (defmethod stream-write-char ((s null-stream) char)
> >    (declare (ignore char)))
> >
> > the IGNORE declaration doesn't seem too painful and seems to make the
> > intentional ignoring of the argument clear]
> >
> > It's certainly possible to think of examples where the failure to
> > reference a parameter that's specialized to the T class is in no way
> > anomalous (likely because such parameters were used solely for
> > discrimination.)  I can't think of a way for the compiler to guess
> > that when compiling a method body (or at least no way for it to guess
> > right consistently): that depends on contracts and conventions and (to
> > some extent at least) on coding style.
> >
> > It's not clear that method qualifiers change this significantly,
> > but I do wonder about cases like:
> >
> > (defmethod stream-write-char ((s some-stream-class) c)
> >    (call-next-method))
> >
> > since the 0-arg CALL-NEXT-METHOD arguably references the explicit
> > arguments.
> >
> > DEFMETHOD could macroexpand into something which declares all
> > required method arguments to be IGNORABLE (it currently does
> > that only for those things that're specialized to something
> > other than the T class), perhaps under the control of some
> > global variable (*DEFMETHOD-DECLARE-ALL-SPECIALIZED-ARGUMENTS-IGNORABLE*
> > or some such.)  I don't know how you'd know how to set that so
> > that you got warnings in cases like the STREAM-WRITE-CHAR but
> > not in the cases that you find annoying.
> >
> >
> >
> > On Wed, 14 Nov 2007, Hans Hübner wrote:
> >
> > > Hi,
> > >
> > > is there a way to make OpenMCL stop complaining about unused arguments
> > > in generic function methods?  I am fine with the warning in standard
> > > function definitions, but with methods it makes less sense because
> > > often, the arguments are present just to match the generic function
> > > signature and rightfully ignored.  This is especially true with
> > > :before and :after methods, where I find it very annoying to have to
> > > explicitly ignore unused arguments
> > >
> > > -Hans
> > > _______________________________________________
> > > Openmcl-devel mailing list
> > > Openmcl-devel at clozure.com
> > > http://clozure.com/mailman/listinfo/openmcl-devel
> > >
> > >
>




More information about the Openmcl-devel mailing list