;; 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)))
`(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))
(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))))
`(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)
#!+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
((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))))
`(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
+ ,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
(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
+ ,body)
nil
',doc)))))