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

Re: [spr8239] package-lock warning messages



] From: Eyvind Ness <eyvind.ness@hrp.no>
] Date: Thu, 29 Apr 93 7:14 GMT
] 
]   ;; Date: Wed, 28 April 1993, 14:19 -0700
]   ;; From: Kevin Layer
]   ;;
]   ;; >> I'm also a bit annoyed by the persistence with which Allegro protects
]   ;; >> the built-in CL symbols - I can't even locally override CL fundefs
]   ;; >> within an FLET/LABELS without having a flood of warnings thrown at me.
]   ;; 
]   ;; This is discussed in the Allegro CL User Guide, page 3-25, volume 1.
]   ;; In short, you can disable package locking, though it is strongly
]   ;; discouraged.  You would not believe how many sprs we had because
]   ;; people did this:
]   ;; 
]   ;; 	(defstruct instance ...)
]   ;; 
]   ;; which obviously clashes with make-instance if package locking is not
]   ;; enabled.
] 
] Yes. Yes. Most of us know already, I think. What is so strange, in my
] opinion, is that you can't *locally* override a cl-symbol within the
] body of an FLET or LABELS without getting lots of annoying warning
] messages. Note that I'm not making a permanent *change* to the
] cl-definition - it's only a *temporary* redefinition of it.

There's one more hazard you may not have thought of: some macro you
use in the body (or even a compiler macro) may expand into code which
uses the system function you have shadowed.  CLtL2 talks about this
on pages 259-261.  On the other hand, it sounds like you're willing
to take these risks.

] not found a proper way to bind EXCL:*ENABLE-PACKAGE-LOCKED-ERRORS* to
] NIL while compiling and using a macro-definition that expands to a
] function that uses FLET on a cl-symbol. What I have is something like:
] 
] (defmacro franz-dislikes-this-macro (&rest body)
]  ...
]  `(let ((excl:*enable-package-locked-errors* nil))
]      ... 
]      . ,body))
] 
The "let" is bound at the wrong time: at evaluation time, not
at compile time.  Since you're already doing all these other things,
you shouldn't mind using cltl1:compiler-let

(defmacro compile-without-package-locks (&rest body)
  `(cltl1:compiler-let ((excl:*enable-package-locked-errors* nil))
     ,@body))

USER(35): (defun test-break (x)
	    (compile-without-package-locks
	     (flet ((break (&rest x)
		      (format t "~&no brakes!")))
	       (when (> x 3)
		 (break))
	       (* x x))))
TEST-BREAK
USER(36): (test-break 45)
no brakes!
2025
...
USER(38): (compile 'test-break)
; While compiling (FLET TEST-BREAK BREAK):
Warning: variable X is never used
TEST-BREAK
T
T
USER(39): (test-break 45)
no brakes!
2025


John (boyland@cs.berkeley.edu)