(I seem to've screwed up during the checkin of 0.pre7.131 before, so
[sbcl.git] / src / code / early-setf.lisp
index bd1c473..4ee0528 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)
@@ -50,9 +47,9 @@
          ;; Local functions inhibit global SETF methods.
          ((and environment
                (let ((name (car form)))
-                 (dolist (x (sb!c::lexenv-functions environment))
+                 (dolist (x (sb!c::lexenv-funs 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)))))
 
@@ -103,7 +101,7 @@ GET-SETF-EXPANSION directly."
                                 `(funcall #'(setf ,(car form)))
                                 t))))
 
-(defun get-setf-method-inverse (form inverse setf-function)
+(defun get-setf-method-inverse (form inverse setf-fun)
   (let ((new-var (gensym))
        (vars nil)
        (vals nil))
@@ -112,18 +110,19 @@ GET-SETF-EXPANSION directly."
       (push x vals))
     (setq vals (nreverse vals))
     (values vars vals (list new-var)
-           (if setf-function
+           (if setf-fun
                `(,@inverse ,new-var ,@vars)
                `(,@inverse ,@vars ,new-var))
            `(,(car form) ,@vars))))
 \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
@@ -175,8 +174,8 @@ GET-SETF-EXPANSION directly."
         `(let* ,(nreverse bindlist) ,@(nreverse storelist) ,resultvar))
       (multiple-value-bind (sm1 sm2 sm3 sm4 sm5)
          (get-setf-method (first arglist) env)
-       (mapc #'(lambda (var val)
-                 (push `(,var ,val) bindlist))
+       (mapc (lambda (var val)
+               (push `(,var ,val) bindlist))
              sm1
              sm2)
        (push `(,lastvar ,sm5) bindlist)
@@ -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))))
@@ -384,13 +378,13 @@ GET-SETF-EXPANSION directly."
               `(eval-when (:compile-toplevel :load-toplevel :execute)
                  (assign-setf-macro
                   ',access-fn
-                  #'(lambda (,access-form-var ,env-var)
-                      (declare (ignore ,env-var))
-                      (%defsetf ,access-form-var ,(length store-variables)
-                                #'(lambda (,arglist-var)
-                                    ,@local-decs
-                                    (block ,access-fn
-                                      ,body))))
+                  (lambda (,access-form-var ,env-var)
+                    (declare (ignore ,env-var))
+                    (%defsetf ,access-form-var ,(length store-variables)
+                              (lambda (,arglist-var)
+                                ,@local-decs
+                                (block ,access-fn
+                                  ,body))))
                   nil
                   ',doc))))))
        (t
@@ -438,9 +432,9 @@ GET-SETF-EXPANSION directly."
                        :environment environment)
       `(eval-when (:compile-toplevel :load-toplevel :execute)
         (assign-setf-macro ',access-fn
-                           #'(lambda (,whole ,environment)
-                               ,@local-decs
-                               (block ,access-fn ,body))
+                           (lambda (,whole ,environment)
+                             ,@local-decs
+                             (block ,access-fn ,body))
                            nil
                            ',doc)))))
 
@@ -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)