From: Mark Wooding Date: Wed, 21 Oct 2015 23:46:28 +0000 (+0100) Subject: anaphora.lisp: Rewrite `asetf' to use `with-places/gensyms'. X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/commitdiff_plain/0eed4749891adf0a7be89e786b8968ee805a8d41 anaphora.lisp: Rewrite `asetf' to use `with-places/gensyms'. This adds a dependency on `mdw-base.lisp'. That's what the base package is for. --- diff --git a/anaphora.lisp b/anaphora.lisp index 3fd69c5..be2fae4 100644 --- a/anaphora.lisp +++ b/anaphora.lisp @@ -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) @@ -78,23 +78,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) diff --git a/mdw.asd b/mdw.asd index 8a91809..9287a55 100644 --- a/mdw.asd +++ b/mdw.asd @@ -9,7 +9,7 @@ :version "2.0.3" :author "Mark Wooding " :components ((:file "mdw-base") - (:file "anaphora") + (:file "anaphora" :depends-on ("mdw-base")) (:file "sys-base") (:file "factorial") (:file "queue")