base: New `until' macro does the obvious thing.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 17 May 2006 18:40:14 +0000 (19:40 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 17 May 2006 18:40:14 +0000 (19:40 +0100)
mdw-base.lisp

index 37a3068..e87c511 100644 (file)
@@ -33,7 +33,7 @@
           #:stringify #:mappend #:listify #:fix-pair #:pairify #:parse-body
           #:whitespace-char-p
           #:slot-uninitialized
-          #:nlet #:while #:case2 #:ecase2
+          #:nlet #:while #:until #:case2 #:ecase2
           #:with-gensyms #:let*/gensyms #:with-places
           #:locp #:locf #:ref #:with-locatives
           #:update-place #:update-place-after
 
 (defmacro while (cond &body body)
   "If COND is false, evaluate to nil; otherwise evaluate BODY and try again."
-  `(loop
-     (unless ,cond (return))
-     ,@body))
+  `(loop (unless ,cond (return)) (progn ,@body)))
+
+(defmacro until (cond &body body)
+  "If COND is true, evaluate to nil; otherwise evaluate BODY and try again."
+  `(loop (when ,cond (return)) (progn ,@body)))
 
 (compile-time-defun do-case2-like (kind vform clauses)
   "Helper function for `case2' and `ecase2'."