X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/blobdiff_plain/e8567770c29b1e26c340c1666a2d3b28c06454c8..813da880d2d77f04ea623f426d543d298528f967:/anaphora.lisp diff --git a/anaphora.lisp b/anaphora.lisp index 3fd69c5..d8686e9 100644 --- a/anaphora.lisp +++ b/anaphora.lisp @@ -1,7 +1,5 @@ ;;; -*-lisp-*- ;;; -;;; $Id$ -;;; ;;; Anaphoric extensions ;;; ;;; (c) 2005 Straylight/Edgeware @@ -24,7 +22,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) @@ -78,23 +76,19 @@ ,@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)