diff --git a/code/macros.lisp b/code/macros.lisp index 21230f6dfd3e89cfc19de4ec675b0dc8e8b9d0ac..6052faf28b1b0f70238584797370419f62290c6b 100644 --- a/code/macros.lisp +++ b/code/macros.lisp @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/macros.lisp,v 1.77 2002/10/29 16:42:22 toy Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/macros.lisp,v 1.78 2002/10/30 18:08:32 toy Exp $") ;;; ;;; ********************************************************************** ;;; @@ -886,16 +886,23 @@ (defmacro push (obj place &environment env) "Takes an object and a location holding a list. Conses the object onto the list, returning the modified list. OBJ is evaluated before PLACE." + + ;; This special case for place being a symbol isn't strictly needed. + ;; It's so we can do push (and pushnew) with a kernel.core. (if (and (symbolp place) (eq place (macroexpand place env))) `(setq ,place (cons ,obj ,place)) (multiple-value-bind (dummies vals newval setter getter) (get-setf-expansion place env) - (let ((g (gensym))) - `(let* ((,g ,obj) - ,@(mapcar #'list dummies vals) - (,(car newval) (cons ,g ,getter))) - ,setter))))) + ;; Handle multiple values + `(let* (,@(mapcar #'list dummies vals)) + (multiple-value-bind ,newval + ,(if (cdr newval) + `(values ,@(rest (mapcar #'(lambda (a b) + (list 'cons a b)) + obj getter))) + `(cons ,obj ,getter)) + ,setter))))) (defmacro pushnew (obj place &rest keys &environment env) "Takes an object and a location holding a list. If the object is already @@ -905,12 +912,15 @@ (eq place (macroexpand place env))) `(setq ,place (adjoin ,obj ,place ,@keys)) (multiple-value-bind (vars vals stores setter getter) - (get-setf-method place env) - (let ((tem (gensym))) - `(let* ((,tem ,obj) - ,@(mapcar #'list vars vals) - (,(car stores) (adjoin ,tem ,getter ,@keys))) - ,setter))))) + (get-setf-expansion place env) + `(let* (,@(mapcar #'list vars vals)) + (multiple-value-bind ,stores + ,(if (cdr stores) + `(values ,@(rest (mapcar #'(lambda (a b) + `(adjoin ,a ,b ,@keys)) + obj getter))) + `(adjoin ,obj ,getter ,@keys)) + ,setter))))) (defmacro pop (place &environment env)