Search code examples
lispcommon-lispcompiler-warningssbcl

sbcl: muffle style-warning in defmacro


In sbcl, I know I can muffle the anticipated messages when using both &optional and &key in defun, but that doesn't seem to work in defmacro. (I should just redesign/rewrite, I know, but this is legacy code.)

When I compile this file ...

(declaim (sb-ext:muffle-conditions style-warning))

(defun wilma (&optional wilma1 &key wilma2 wilma3)
  (declare (ignore wilma1 wilma2 wilma3)))

(defmacro betty (&optional betty1 &key betty2 betty3)
  (declare (ignore betty1 betty2 betty3)))

... this happens:

home:~/sbcl/experiments/style-warning.d$ sbcl --noinform
* (compile-file "5.lisp")

; compiling file "/u/home/sbcl/experiments/style-warning.d/5.lisp" (written 09 OCT 2017 03:31:44 PM):
; compiling (DECLAIM (MUFFLE-CONDITIONS STYLE-WARNING))
; compiling (DEFUN WILMA ...)
; compiling (DEFMACRO BETTY ...)
; file: /u/home/sbcl/experiments/style-warning.d/5.lisp
; in: DEFMACRO BETTY
;     (DEFMACRO BETTY (&OPTIONAL BETTY1 &KEY BETTY2 BETTY3)
;       (DECLARE (IGNORE BETTY1 BETTY2 BETTY3)))
; 
; caught STYLE-WARNING:
;   &OPTIONAL and &KEY found in the same lambda list: (&OPTIONAL BETTY1 &KEY BETTY2
;                                                      BETTY3)
; 
; compilation unit finished
;   caught 1 STYLE-WARNING condition


; /u/home/sbcl/experiments/style-warning.d/5.fasl written
; compilation finished in 0:00:00.018
#P"/u/home/sbcl/experiments/style-warning.d/5.fasl"
T
NIL
* (exit)
home:~/sbcl/experiments/style-warning.d$ 

How do I suppress these diagnostics?

EDIT 1:

Since this is legacy code and I'll just massage it for sbcl-readiness and then leave it alone, there's no reason I can't do something like this in any code which uses it:

home:~/sbcl/experiments/style-warning.d$ sbcl --noinform
* (with-open-file (*error-output* "/dev/null" :direction :output :if-exists :append) 
(compile-file "5.lisp"))

; compiling file "/u/home/sbcl/experiments/style-warning.d/5.lisp" (written 09 OCT 2017 03:31:44 PM):
; compiling (DECLAIM (MUFFLE-CONDITIONS STYLE-WARNING))
; compiling (DEFUN WILMA ...)
; compiling (DEFMACRO BETTY ...)

; /u/home/sbcl/experiments/style-warning.d/5.fasl written
; compilation finished in 0:00:00.017
#P"/u/home/sbcl/experiments/style-warning.d/5.fasl"
T
NIL
* (exit)
home:~/sbcl/experiments/style-warning.d$ 

But is there something out there which can suppress style warnings in macro definitions?


Solution

  • You need to run

    (declaim (sb-ext:muffle-conditions style-warning))
    

    before the form (defmacro betty ...) is compiled.

    One way to do that is

    $ sbcl --non-interactive --eval '(declaim (sb-ext:muffle-conditions style-warning))' --eval '(compile-file "5")'
    This is SBCL 1.4.0, an implementation of ANSI Common Lisp.
    More information about SBCL is available at <http://www.sbcl.org/>.
    
    SBCL is free software, provided as is, with absolutely no warranty.
    It is mostly in the public domain; some portions are provided under
    BSD-style licenses.  See the CREDITS and COPYING files in the
    distribution for more information.
    ; compiling file "/Users/sds/lisp/5.lisp" (written 09 OCT 2017 09:51:51 PM):
    ; compiling (DEFUN WILMA ...)
    ; compiling (DEFMACRO BETTY ...)
    
    ; /Users/sds/lisp/5.fasl written
    ; compilation finished in 0:00:00.010
    

    where the file 5.lisp only contains wilma and betty:

    (defun wilma (&optional wilma1 &key wilma2 wilma3)
      (declare (ignore wilma1 wilma2 wilma3)))
    
    (defmacro betty (&optional betty1 &key betty2 betty3)
      (declare (ignore betty1 betty2 betty3)))