[slime-devel] What's the difference between compile and load?

E'Chao Zhang echaozh at gmail.com
Thu Mar 1 20:50:13 UTC 2007


Thomas F. Burdick wrote:
> 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.
>
Well, I didn't quite expect it to be a problem of Slime... but I thought 
it may have something to do with it... and it's an active list : )

Thanks for the great explanation, I should try it.



More information about the slime-devel mailing list