1.0.44.4: make MAKE-FUNCTIONAL-FROM-TOPLEVEL-LAMBDA build proper XEPs
[sbcl.git] / src / code / defmacro.lisp
index a408ec9..033cc58 100644 (file)
             ;; should deal with clearing old compiler information for
             ;; the functional value."
             ,@(unless set-p
-                '((declare (ignore lambda-list debug-name))))
-            (with-single-package-locked-error ()
-              (case (info :function :kind name)
-                (:function
-                 (let ((where-from (info :function :where-from name)))
-                   (when (eq :defined where-from)
-                     (assert-symbol-home-package-unlocked name "defining ~S as a macro"))
-                   (style-warn
-                    "~S is being redefined as a macro when it was ~
+                '((declare (ignore lambda-list debug-name doc))))
+            (let ((kind (info :function :kind name)))
+              ;; Check for special form before package locks.
+              (when (eq :special-form kind)
+                (error "The special operator ~S can't be redefined as a macro."
+                       name))
+              (with-single-package-locked-error (:symbol name "defining ~S as a macro")
+                (when (eq :function kind)
+                  (style-warn
+                   "~S is being redefined as a macro when it was ~
                      previously ~(~A~) to be a function."
-                    name where-from))
-                 (undefine-fun-name name))
-                (:special-form
-                 (error "The special form ~S can't be redefined as a macro."
-                        name)))
-              (clear-info :function :where-from name)
+                   name (info :function :where-from name))
+                  (undefine-fun-name name))
+                (clear-info :function :where-from name)
 
-              ;; FIXME: It would be nice to warn about DEFMACRO of an
-              ;; already-defined macro, but that's slightly hard to do
-              ;; because in common usage DEFMACRO is defined at compile
-              ;; time and then redefined at load time. We'd need to make a
-              ;; distinction between the defined-at-compile-time state and
-              ;; the defined-at-load-time state to make this work. (Trying
-              ;; to warn about duplicate DEFTYPEs runs into the same
-              ;; problem.)
-              #+nil
-              (when (sb!xc:macro-function name)
-                ;; Someday we could check for macro arguments
-                ;; being incompatibly redefined. Doing this right
-                ;; will involve finding the old macro lambda-list
-                ;; and comparing it with the new one.
-                (style-warn "redefining ~/sb-impl::print-symbol-with-prefix/ ~
+               ;; FIXME: It would be nice to warn about DEFMACRO of an
+               ;; already-defined macro, but that's slightly hard to do
+               ;; because in common usage DEFMACRO is defined at compile
+               ;; time and then redefined at load time. We'd need to make a
+               ;; distinction between the defined-at-compile-time state and
+               ;; the defined-at-load-time state to make this work. (Trying
+               ;; to warn about duplicate DEFTYPEs runs into the same
+               ;; problem.)
+               #+nil
+               (when (sb!xc:macro-function name)
+                 ;; Someday we could check for macro arguments
+                 ;; being incompatibly redefined. Doing this right
+                 ;; will involve finding the old macro lambda-list
+                 ;; and comparing it with the new one.
+                 (style-warn "redefining ~/sb-impl::print-symbol-with-prefix/ ~
                                  in DEFMACRO" name))
-              (setf (sb!xc:macro-function name) definition)
-              ,(when set-p
-                     `(setf (%fun-doc definition) doc
-                            (%fun-lambda-list definition) lambda-list
-                            (%fun-name definition) debug-name)))
+               (setf (sb!xc:macro-function name) definition)
+               ,(when set-p
+                      `(setf (%fun-doc definition) doc
+                             (%fun-lambda-list definition) lambda-list
+                             (%fun-name definition) debug-name))))
             name))))
   (progn
     (def (:load-toplevel :execute) #-sb-xc-host t #+sb-xc-host nil)