On 3/1/07, E'Chao Zhang echaozh@gmail.com wrote:
Hi all,
I'm new to the language and to the REPL environment.
When I'm using Slime, and use C-c C-k to compile-and-load a file which contains constant definitions, Slime sometimes complains about constant redefinition. On the other hand, when I use C-c M-k to just compile the file, Slime sometimes just ignores the change in the file. I'm not quite sure if the latter phenomenon is just coincidence or it is so designated.
This isn't a Slime issue as much as in implementation one. You don't say what Lisp you're using, but I assume it's SBCL, as that matches the behavior you described.
The problem is that compiling a form *may* cause the things it defines to become defined, and in the case of constants and SBCL, it does. Then when you load the file, it gets redefined. Which is fine if the constant was 3, but not if it was '(1 2 3).
A common solution is to do something like:
(defmacro defconstant-equal (var value &optional doc) `(defconstant ,var (if (not (boundp ',var)) ,value (let ((old (symbol-value ',var)) (new ,value)) (if (equal old new) old (prog1 new (cerror "Redefine it anyway" "New value ~S for constant ~S is not equal to old value ~S" new ',var old))))) ,@(when doc (list doc))))
Then use defconstant-equal instead of defconstant. Or just use defparameter.