0.8alpha.0.9:
[sbcl.git] / src / code / early-setf.lisp
index 6fc65d7..76a8c43 100644 (file)
@@ -47,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)))
@@ -101,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))
@@ -110,7 +110,7 @@ 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))))
@@ -174,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)
@@ -186,54 +186,43 @@ GET-SETF-EXPANSION directly."
   #!+sb-doc
   "Takes an object and a location holding a list. Conses the object onto
   the list, returning the modified list. OBJ is evaluated before PLACE."
-  (if (symbolp place)
-      `(setq ,place (cons ,obj ,place))
-      (multiple-value-bind
-         (dummies vals newval setter getter)
-         (get-setf-method place env)
-       (let ((g (gensym)))
-         `(let* ((,g ,obj)
-                 ,@(mapcar #'list dummies vals)
-                 (,(car newval) (cons ,g ,getter)))
-           ,setter)))))
+  (multiple-value-bind (dummies vals newval setter getter)
+      (get-setf-method place env)
+    (let ((g (gensym)))
+      `(let* ((,g ,obj)
+              ,@(mapcar #'list dummies vals)
+              (,(car newval) (cons ,g ,getter)))
+         ,setter))))
 
 (defmacro-mundanely pushnew (obj place &rest keys &environment env)
   #!+sb-doc
   "Takes an object and a location holding a list. If the object is already
   in the list, does nothing. Else, conses the object onto the list. Returns
   NIL. If there is a :TEST keyword, this is used for the comparison."
-  (if (symbolp place)
-      `(setq ,place (adjoin ,obj ,place ,@keys))
-      (multiple-value-bind (dummies vals newval setter getter)
-         (get-setf-method place env)
-       (do* ((d dummies (cdr d))
-             (v vals (cdr v))
-             (let-list nil))
-            ((null d)
-             (push (list (car newval) `(adjoin ,obj ,getter ,@keys))
-                   let-list)
-             `(let* ,(nreverse let-list)
-                ,setter))
-         (push (list (car d) (car v)) let-list)))))
+  (multiple-value-bind (dummies vals newval setter getter)
+      (get-setf-method place env)
+    (let ((g (gensym)))
+      `(let* ((,g ,obj)
+              ,@(mapcar #'list dummies vals)
+              (,(car newval) (adjoin ,g ,getter ,@keys)))
+         ,setter))))
 
 (defmacro-mundanely pop (place &environment env)
   #!+sb-doc
   "The argument is a location holding a list. Pops one item off the front
   of the list and returns it."
-  (if (symbolp place)
-      `(prog1 (car ,place) (setq ,place (cdr ,place)))
-      (multiple-value-bind (dummies vals newval setter getter)
-         (get-setf-method place env)
-       (do* ((d dummies (cdr d))
-             (v vals (cdr v))
-             (let-list nil))
-            ((null d)
-             (push (list (car newval) getter) let-list)
-             `(let* ,(nreverse let-list)
-                (prog1 (car ,(car newval))
-                       (setq ,(car newval) (cdr ,(car newval)))
-                       ,setter)))
-         (push (list (car d) (car v)) let-list)))))
+  (multiple-value-bind (dummies vals newval setter getter)
+      (get-setf-method place env)
+    (do* ((d dummies (cdr d))
+          (v vals (cdr v))
+          (let-list nil))
+         ((null d)
+          (push (list (car newval) getter) let-list)
+          `(let* ,(nreverse let-list)
+             (prog1 (car ,(car newval))
+               (setq ,(car newval) (cdr ,(car newval)))
+               ,setter)))
+      (push (list (car d) (car v)) let-list))))
 
 (defmacro-mundanely remf (place indicator &environment env)
   #!+sb-doc
@@ -339,11 +328,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)
-          (proclaim-as-fun-name name))
          ((not (eq (symbol-package name) (symbol-package 'aref)))
           (style-warn "defining setf macro for ~S when ~S is fbound"
                       name `(setf ,name))))
@@ -383,19 +367,20 @@ 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
         (error "ill-formed DEFSETF for ~S" access-fn))))
 
 (defun %defsetf (orig-access-form num-store-vars expander)
+  (declare (type function expander))
   (let (subforms
        subform-vars
        subform-exprs
@@ -429,17 +414,16 @@ GET-SETF-EXPANSION directly."
   (unless (symbolp access-fn)
     (error "DEFINE-SETF-EXPANDER access-function name ~S is not a symbol."
           access-fn))
-  (let ((whole (gensym "WHOLE-"))
-       (environment (gensym "ENV-")))
+  (with-unique-names (whole environment)
     (multiple-value-bind (body local-decs doc)
        (parse-defmacro lambda-list whole body access-fn
                        'sb!xc:define-setf-expander
                        :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)))))