Lots of tidying up.
[lisp] / anaphora.lisp
index c7a4b08..d8686e9 100644 (file)
@@ -1,7 +1,5 @@
 ;;; -*-lisp-*-
 ;;;
-;;; $Id$
-;;;
 ;;; Anaphoric extensions
 ;;;
 ;;; (c) 2005 Straylight/Edgeware
 ;;; it under the terms of the GNU General Public License as published by
 ;;; the Free Software Foundation; either version 2 of the License, or
 ;;; (at your option) any later version.
-;;; 
+;;;
 ;;; This program is distributed in the hope that it will be useful,
 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;;; GNU General Public License for more details.
-;;; 
+;;;
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-(defpackage #:mdw.anaphora
-  (:use #:common-lisp)
-  (:export #:it
-          #:aif #:aif2 #:awhen #:awhen2
-          #:aand #:awhile #:asetf #:acond))
-(in-package #:mdw.anaphora)
+(defpackage #:anaphora
+  (:use #:common-lisp #:mdw.base))
+(in-package #:anaphora)
+
+(export 'it)
 
+(export 'aif)
 (defmacro aif (cond then &optional else)
   "Bind `it' to result of COND when evaluating THEN or ELSE."
   `(let ((it ,cond))
      (if it ,then ,@(and else (list else)))))
+
+(export 'aif2)
 (defmacro aif2 (cond then &optional else)
   "Bind `it' to first value of COND; switch on second."
   (let ((tmp (gensym)))
        (declare (ignorable it))
        (if ,tmp ,then ,@(and else (list else))))))
 
+(export 'awhen)
 (defmacro awhen (cond &body body)
   "Bind `it' to result of COND when evaluating BODY."
   `(let ((it ,cond))
      (when it ,@body)))
+
+(export 'awhen2)
 (defmacro awhen2 (cond &body body)
   "Bind `it' to first value of COND; switch on second."
   (let ((tmp (gensym)))
@@ -52,6 +55,7 @@
        (declare (ignorable it))
        (when ,tmp ,@body))))
 
+(export 'aand)
 (defmacro aand (&rest things)
   "Like `and', with `it' bound to previous value."
   (labels ((foo (things)
@@ -63,6 +67,7 @@
        (foo things)
        t)))
 
+(export 'awhile)
 (defmacro awhile (cond &body body)
   "Like `while', with `it' bound to value of COND in BODY."
   `(loop
        (unless it (return))
        ,@body)))
 
-(defmacro asetf (&rest pairs &environment env)
+(export 'asetf)
+(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))))
-                 
+   PLACE."
+  `(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)
   "Like `cond', but in each clause the consequent has `it' bound to the value
-of its guard."
+   of its guard."
   (labels ((foo (clauses)
             (when clauses
               (let ((tmp (gensym))