X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fmacros.lisp;h=935fe5b6cc05242c1fd4462ff2a4b90ed0021315;hb=57c91e4719ca9d0f9b8bef3b713ba40088a275f6;hp=3c95c6e52c3b3cc1059f701feb42c47a9c7bad34;hpb=08d05510b51708853ca998154d8096b21d85edab;p=sbcl.git diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 3c95c6e..935fe5b 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -73,7 +73,7 @@ invoked. In that case it will store into PLACE and start over." ;; variable to work around Python's blind spot in type derivation. ;; For more complex places getting the type derived should not ;; matter so much anyhow. - (let ((expanded (sb!xc:macroexpand place env))) + (let ((expanded (%macroexpand place env))) (if (symbolp expanded) `(do () ((typep ,place ',type)) @@ -99,18 +99,19 @@ invoked. In that case it will store into PLACE and start over." (:symbol name "defining ~A as a symbol-macro")) (sb!c:with-source-location (source-location) (setf (info :source-location :symbol-macro name) source-location)) - (ecase (info :variable :kind name) - ((:macro :global nil) - (setf (info :variable :kind name) :macro) - (setf (info :variable :macro-expansion name) expansion)) - (:special - (error 'simple-program-error - :format-control "Symbol macro name already declared special: ~S." - :format-arguments (list name))) - (:constant - (error 'simple-program-error - :format-control "Symbol macro name already declared constant: ~S." - :format-arguments (list name)))) + (let ((kind (info :variable :kind name))) + (ecase kind + ((:macro :unknown) + (setf (info :variable :kind name) :macro) + (setf (info :variable :macro-expansion name) expansion)) + ((:special :global) + (error 'simple-program-error + :format-control "Symbol macro name already declared ~A: ~S." + :format-arguments (list kind name))) + (:constant + (error 'simple-program-error + :format-control "Symbol macro name already defined as a constant: ~S." + :format-arguments (list name))))) name) ;;;; DEFINE-COMPILER-MACRO @@ -151,22 +152,10 @@ invoked. In that case it will store into PLACE and start over." ;; FIXME: warn about incompatible lambda list with ;; respect to parent function? (setf (sb!xc:compiler-macro-function name) definition) - ;; FIXME: Add support for (SETF FDOCUMENTATION) when - ;; object is a list and type is COMPILER-MACRO. (Until - ;; then, we have to discard any compiler macro - ;; documentation for (SETF FOO).) - (unless (listp name) - (setf (fdocumentation name 'compiler-macro) doc)) ,(when set-p - `(case (widetag-of definition) - (#.sb!vm:closure-header-widetag - (setf (%simple-fun-arglist (%closure-fun definition)) - lambda-list - (%simple-fun-name (%closure-fun definition)) - debug-name)) - (#.sb!vm:simple-fun-header-widetag - (setf (%simple-fun-arglist definition) lambda-list - (%simple-fun-name definition) debug-name)))) + `(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) @@ -176,7 +165,8 @@ invoked. In that case it will store into PLACE and start over." (eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) -(define-condition duplicate-case-key-warning (style-warning) +;;; Make this a full warning during SBCL build. +(define-condition duplicate-case-key-warning (#-sb-xc-host style-warning #+sb-xc-host warning) ((key :initarg :key :reader case-warning-key) (case-kind :initarg :case-kind @@ -271,6 +261,17 @@ invoked. In that case it will store into PLACE and start over." ,@forms) clauses)) (t + (when (and (eq name 'case) + (cdr cases) + (memq keyoid '(t otherwise))) + (error 'simple-reference-error + :format-control + "~@<~IBad ~S clause:~:@_ ~S~:@_~S allowed as the key ~ + designator only in the final otherwise-clause, not in a ~ + normal-clause. Use (~S) instead, or move the clause the ~ + correct position.~:@>" + :format-arguments (list 'case case keyoid keyoid) + :references `((:ansi-cl :macro case)))) (push keyoid keys) (check-clause (list keyoid)) (push `((,test ,keyform-value ',keyoid) @@ -314,11 +315,7 @@ invoked. In that case it will store into PLACE and start over." (cond ,@(nreverse clauses) ,@(if errorp - `((t (error 'case-failure - :name ',name - :datum ,keyform-value - :expected-type ',expected-type - :possibilities ',keys)))))))) + `((t (case-failure ',name ,keyform-value ',keys)))))))) ) ; EVAL-WHEN (defmacro-mundanely case (keyform &body cases)