X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Fearly-setf.lisp;h=8a21d7ae2097ba9569a225f263e931c2f27b04f0;hb=f865612b20955e92189b1e683203e12c8f08eb79;hp=bd1c4737440047afaa2e2f33e14f4ebddd2d24d7;hpb=a530bbe337109d898d5b4a001fc8f1afa3b5dc39;p=sbcl.git diff --git a/src/code/early-setf.lisp b/src/code/early-setf.lisp index bd1c473..8a21d7a 100644 --- a/src/code/early-setf.lisp +++ b/src/code/early-setf.lisp @@ -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))) @@ -64,11 +61,12 @@ ;; 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." ;;;; 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)