anaphora.lisp: Rewrite `asetf' to use `with-places/gensyms'.
[lisp] / anaphora.lisp
index 3fd69c5..be2fae4 100644 (file)
@@ -24,7 +24,7 @@
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (defpackage #:anaphora
-  (:use #:common-lisp))
+  (:use #:common-lisp #:mdw.base))
 (in-package #:anaphora)
 
 (export 'it)
        ,@body)))
 
 (export 'asetf)
-(defmacro asetf (&rest pairs &environment env)
+(defmacro asetf (&rest pairs)
   "Set PLACE to value of FORM; in FORM, `it' is bound to current value of
    PLACE."
-  (labels ((foo (pairs)
-            (when pairs
-              (let ((place (car pairs))
-                    (form (cadr pairs))
-                    (rest (cddr pairs)))
-                (cons (multiple-value-bind
-                          (valtmps valforms newtmps setform getform)
-                          (get-setf-expansion place env)
-                        `(let* ,(mapcar #'list valtmps valforms)
-                           (let* ((it ,getform)
-                                  (,(car newtmps) ,form))
-                             ,setform)))
-                      (foo rest))))))
-    (cons 'progn (foo pairs))))
+  `(progn ,@(do ((list nil)
+                (pairs pairs (cddr pairs)))
+               ((endp pairs) (nreverse list))
+             (unless (cdr pairs)
+               (error "Odd number of arguments to `asetf'."))
+             (push (with-places/gensyms ((place (car pairs)))
+                     `(let ((it ,place))
+                        (declare (ignorable it))
+                        (setf ,place ,(cadr pairs))))
+                   list))))
 
 (export 'acond)
 (defmacro acond (&rest clauses)