0.pre7.66:
[sbcl.git] / src / code / early-setf.lisp
index bd1c473..8a21d7a 100644 (file)
@@ -17,9 +17,6 @@
 
 (in-package "SB!IMPL")
 
-(file-comment
-  "$Header$")
-
 ;;; The inverse for a generalized-variable reference function is stored in
 ;;; one of two ways:
 ;;;
@@ -35,7 +32,7 @@
 (declaim (ftype (function (t &optional (or null sb!c::lexenv))) sb!xc:get-setf-expansion))
 (defun sb!xc:get-setf-expansion (form &optional environment)
   #!+sb-doc
-  "Returns five values needed by the SETF machinery: a list of temporary
+  "Return five values needed by the SETF machinery: a list of temporary
    variables, a list of values with which to fill them, a list of temporaries
    for the new values, the setting function, and the accessing function."
   (let (temp)
@@ -52,7 +49,7 @@
                (let ((name (car form)))
                  (dolist (x (sb!c::lexenv-functions environment))
                    (when (and (eq (car x) name)
-                              (not (sb!c::defined-function-p (cdr x))))
+                              (not (sb!c::defined-fun-p (cdr x))))
                      (return t)))))
           (expand-or-get-setf-inverse form environment))
          ((setq temp (info :setf :inverse (car form)))
           ;; for macroexpansion in general. -- WHN 19991128
           (funcall temp
                    form
-                   ;; As near as I can tell from the ANSI spec, macroexpanders
-                   ;; have a right to expect an actual lexical environment,
-                   ;; not just a NIL which is to be interpreted as a null
-                   ;; lexical environment. -- WHN 19991128
-                   (or environment (make-null-lexenv))))
+                   ;; As near as I can tell from the ANSI spec,
+                   ;; macroexpanders have a right to expect an actual
+                   ;; lexical environment, not just a NIL which is to
+                   ;; be interpreted as a null lexical environment.
+                   ;; -- WHN 19991128
+                   (coerce-to-lexenv environment)))
          (t
           (expand-or-get-setf-inverse form environment)))))
 
@@ -119,11 +117,12 @@ GET-SETF-EXPANSION directly."
 \f
 ;;;; SETF itself
 
-;;; Except for atoms, we always call GET-SETF-EXPANSION, since it has some
-;;; non-trivial semantics. But when there is a setf inverse, and G-S-E uses
-;;; it, then we return a call to the inverse, rather than returning a hairy let
-;;; form. This is probably important mainly as a convenience in allowing the
-;;; use of SETF inverses without the full interpreter.
+;;; Except for atoms, we always call GET-SETF-EXPANSION, since it has
+;;; some non-trivial semantics. But when there is a setf inverse, and
+;;; G-S-E uses it, then we return a call to the inverse, rather than
+;;; returning a hairy LET form. This is probably important mainly as a
+;;; convenience in allowing the use of SETF inverses without the full
+;;; interpreter.
 (defmacro-mundanely setf (&rest args &environment env)
   #!+sb-doc
   "Takes pairs of arguments like SETQ. The first is a place and the second
@@ -286,10 +285,10 @@ GET-SETF-EXPANSION directly."
            ((eq arg '&rest)
             (if (symbolp (cadr ll))
               (setq rest-arg (cadr ll))
-              (error "Non-symbol &REST arg in definition of ~S." name))
+              (error "Non-symbol &REST argument in definition of ~S." name))
             (if (null (cddr ll))
               (return nil)
-              (error "Illegal stuff after &REST arg.")))
+              (error "Illegal stuff after &REST argument.")))
            ((memq arg '(&key &allow-other-keys &aux))
             (error "~S not allowed in DEFINE-MODIFY-MACRO lambda list." arg))
            ((symbolp arg)
@@ -329,7 +328,7 @@ GET-SETF-EXPANSION directly."
 ;;;; DEFSETF
 
 (eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute)
-  ;;; Assign setf macro information for NAME, making all appropriate checks.
+  ;;; Assign SETF macro information for NAME, making all appropriate checks.
   (defun assign-setf-macro (name expander inverse doc)
     (cond ((gethash name sb!c:*setf-assumed-fboundp*)
           (warn
@@ -340,11 +339,6 @@ GET-SETF-EXPANSION directly."
          ((not (fboundp `(setf ,name)))
           ;; All is well, we don't need any warnings.
           (values))
-         ((info :function :accessor-for name)
-          (warn "defining SETF macro for DEFSTRUCT slot ~
-                accessor; redefining as a normal function: ~S"
-                name)
-          (sb!c::proclaim-as-function-name name))
          ((not (eq (symbol-package name) (symbol-package 'aref)))
           (style-warn "defining setf macro for ~S when ~S is fbound"
                       name `(setf ,name))))
@@ -518,10 +512,7 @@ GET-SETF-EXPANSION directly."
     (error "SETF of APPLY is only defined for function args like #'SYMBOL."))
   (let ((function (second functionoid))
        (new-var (gensym))
-       (vars (mapcar #'(lambda (x)
-                         (declare (ignore x))
-                         (gensym))
-                     args)))
+       (vars (make-gensym-list (length args))))
     (values vars args (list new-var)
            `(apply #'(setf ,function) ,new-var ,@vars)
            `(apply #',function ,@vars))))
@@ -530,7 +521,7 @@ GET-SETF-EXPANSION directly."
 (sb!xc:define-setf-expander ldb (bytespec place &environment env)
   #!+sb-doc
   "The first argument is a byte specifier. The second is any place form
-  acceptable to SETF. Replaces the specified byte of the number in this
+  acceptable to SETF. Replace the specified byte of the number in this
   place with bits from the low-order end of the new value."
   (declare (type sb!c::lexenv env))
   (multiple-value-bind (dummies vals newval setter getter)