[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

A question about ignoring IGNORE



    Date: Thu, 19 Nov 87 18:24 EST
    From: Beng-Hong Lim <BHLim@JASPER.Palladian.COM>

	Date: Wed, 18 Nov 87 11:17 EST
	From: Jeffrey Mark Siskind <Qobi@ZERMATT.LCS.MIT.EDU>

	If I have a macro which expands into some lisp code which contains
	local variable definitions (either through LET or DEFUN etc.)
	and I don't know or care whether all such variables will be used
	by any particular expansion of the macro, I run into the
	following annoying problem. The compiler will complain and issue
	warnings that the variables are unused, but if I declare them
	as (DECLARE (IGNORE FOO)) and the variables are unused then
	the compiler will complain and issue a warning that the variables
	are used. It turns out to be to much of a pain for me to
	determine whether a given variable is used and conditionally
	include its binding in the expanded output of the macro. So
	as the old saying goes, how do I avoid being "Damned if you
	do, and damned if you don't"? What I really want is something
	like (DECLARE (I-DONT-CARE-IF-IT-IS-UNUSED FOO)).
		Jeff


    You can't use a declaration in this case if you want to avoid the
    warnings.  Best you can do is "use" the variables e.g.  by saying
    (PROGN A B C) where A, B, and C are the local variables that may or
    may not be used.  You then hope that the compiler is smart enough to
    ignore the PROGN. (On the Symbolics it is.)  Or if you want something
    more semantically pleasing than PROGN, then use (IGNORE A B C) on
    Symbolics which macroexpands to (PROGN A B C). 

    Beng.



Well, no.  Actually IGNORE is implemented something that looks a lot
like this:


(DEFSUBST IGNORE (&REST IGNORE)
  (DECLARE LT:(SIDE-EFFECTS SIMPLE REDUCIBLE))
  (DECLARE (COMPILER:DO-NOT-RECORD-MACROEXPANSIONS))
  NIL)

Ignoring the declares, it just returns NIL as a subst.  Note that since
IGNORE works differently on the Symbolics than in Common Lisp, you would
have to do something like this for CL compatability:


(DEFUN IGNORE (&REST IGNORED)
  (DECLARE (IGNORE IGNORED))
  NIL)
(PROCLAIM '(INLINE IGNORE))