- (sb!c::%%defconstant name value doc))
-#+sb-xc-host (sb!xc:proclaim '(ftype function sb!c::%%defconstant)) ; to avoid
- ; undefined function warnings
-(defun sb!c::%%defconstant (name value doc)
+ (/show "doing %DEFCONSTANT" name value doc)
+ (unless (symbolp name)
+ (error "constant name not a symbol: ~S" name))
+ (about-to-modify name)
+ (let ((kind (info :variable :kind name)))
+ (case kind
+ (:constant
+ ;; Note 1: This behavior (discouraging any non-EQL
+ ;; modification) is unpopular, but it is specified by ANSI
+ ;; (i.e. ANSI says a non-EQL change has undefined
+ ;; consequences). If people really want bindings which are
+ ;; constant in some sense other than EQL, I suggest either just
+ ;; using DEFVAR (which is usually appropriate, despite the
+ ;; un-mnemonic name), or defining something like
+ ;; SB-INT:DEFCONSTANT-EQX (which is occasionally more
+ ;; appropriate). -- WHN 2000-11-03
+ (unless (eql value
+ (info :variable :constant-value name))
+ (cerror "Go ahead and change the value."
+ "The constant ~S is being redefined."
+ name)))
+ (:global
+ ;; (This is OK -- undefined variables are of this kind. So we
+ ;; don't warn or error or anything, just fall through.)
+ )
+ (t (warn "redefining ~(~A~) ~S to be a constant" kind name))))