X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsetf-funs.lisp;h=741fb61dff3d5e4888f0d744e10dce75fbc022fe;hb=d5520a24b6c356918c2f91bf91dae60f62e1d065;hp=9c9a3ffac2602decada20e47432aacaae6477b7b;hpb=6f408b4ce6a2f411618fe1bebf63ee08093a7d03;p=sbcl.git diff --git a/src/code/setf-funs.lisp b/src/code/setf-funs.lisp index 9c9a3ff..741fb61 100644 --- a/src/code/setf-funs.lisp +++ b/src/code/setf-funs.lisp @@ -12,25 +12,22 @@ (in-package "SB!KERNEL") -(file-comment - "$Header$") - (eval-when (:compile-toplevel :execute) (defun compute-one-setter (name type) (let* ((args (second type)) - (res (type-specifier - (single-value-type - (values-specifier-type (third type))))) - (arglist (make-gensym-list (1+ (length args))))) + (res (type-specifier + (single-value-type + (values-specifier-type (third type))))) + (arglist (make-gensym-list (1+ (length args))))) (cond - ((null (intersection args lambda-list-keywords)) + ((null (intersection args sb!xc:lambda-list-keywords)) `(defun (setf ,name) ,arglist - (declare ,@(mapcar #'(lambda (arg type) - `(type ,type ,arg)) - arglist - (cons res args))) - (setf (,name ,@(rest arglist)) ,(first arglist)))) + (declare ,@(mapcar (lambda (arg type) + `(type ,type ,arg)) + arglist + (cons res args))) + (setf (,name ,@(rest arglist)) ,(first arglist)))) (t (warn "hairy SETF expander for function ~S" name) nil)))) @@ -40,18 +37,23 @@ (collect ((res)) (dolist (pkg packages) (do-external-symbols (sym pkg) - (when (and (fboundp sym) - (eq (info :function :kind sym) :function) - (or (info :setf :inverse sym) - (info :setf :expander sym)) - (not (member sym ignore))) - (let ((type (type-specifier (info :function :type sym)))) - (assert (consp type)) - #!-sb-fluid (res `(declaim (inline (setf ,sym)))) - (res (compute-one-setter sym type)))))) - `(progn ,@(res)))) - -); eval-when (compile eval) + (when (and (fboundp sym) + (eq (info :function :kind sym) :function) + (or (info :setf :inverse sym) + (info :setf :expander sym)) + (not (member sym ignore))) + (res sym)))) + `(progn + ,@(mapcan + (lambda (sym) + (let ((type (type-specifier (info :function :type sym)))) + (aver (consp type)) + (list + #!-sb-fluid `(declaim (inline (setf ,sym))) + (compute-one-setter sym type)))) + (sort (res) #'string<))))) + +) ; EVAL-WHEN (define-setters ("COMMON-LISP") ;; Semantically silly...