[Openmcl-devel] Warning about unused arguments in generic function methods
Hans Hübner
hans at huebner.org
Wed Nov 14 13:15:50 PST 2007
Find an enhanced patch below. I am aware that this is a matter of
taste and style. It would be helpful to have the feature in order to
reduce the noise that much of the contemporary software produces.
-Hans
Index: lib/macros.lisp
===================================================================
RCS file: /usr/local/tmpcvs/openmcl-dev/ccl/lib/macros.lisp,v
retrieving revision 1.118
diff -u -r1.118 macros.lisp
--- lib/macros.lisp 15 Oct 2007 04:10:54 -0000 1.118
+++ lib/macros.lisp 14 Nov 2007 21:13:37 -0000
@@ -1679,7 +1679,8 @@
(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,9 +1709,16 @@
(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)))))
+ (when *defmethod-declare-all-specialized-arguments-ignorable*
+ ;; Put any &optional and &rest parameters onto the list of
ignoreable variables
+ (dolist (key '(&optional &rest))
+ (let ((var (cadr (memq key lambda-list))))
+ (when var (push var refs)))))
(setq lambda-list (nreconc parameters lambda-list))
(multiple-value-bind (body decls doc) (parse-body args env t)
(multiple-value-bind (outer-decls inner-decls)
On Nov 14, 2007 9:50 PM, Hans Hübner <hans at huebner.org> wrote:
> 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