changeset 27376:674b7f75841e

(dolist, dotimes): Moved from cl-macs.el.
author Richard M. Stallman <rms@gnu.org>
date Fri, 21 Jan 2000 02:08:58 +0000
parents 517cdf51989f
children deeb1c237778
files lisp/subr.el
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/subr.el	Fri Jan 21 02:04:16 2000 +0000
+++ b/lisp/subr.el	Fri Jan 21 02:08:58 2000 +0000
@@ -78,6 +78,32 @@
 (put 'unless 'lisp-indent-function 1)
 (put 'unless 'edebug-form-spec '(&rest form))
 
+(defmacro dolist (spec &rest body)
+  "(dolist (VAR LIST [RESULT]) BODY...): loop over a list.
+Evaluate BODY with VAR bound to each car from LIST, in turn.
+Then evaluate RESULT to get return value, default nil."
+  (let ((temp (gensym "--dolist-temp--")))
+    (list 'block nil
+	  (list* 'let (list (list temp (nth 1 spec)) (car spec))
+		 (list* 'while temp (list 'setq (car spec) (list 'car temp))
+			(append body (list (list 'setq temp
+						 (list 'cdr temp)))))
+		 (if (cdr (cdr spec))
+		     (cons (list 'setq (car spec) nil) (cdr (cdr spec)))
+		   '(nil))))))
+
+(defmacro dotimes (spec &rest body)
+  "(dotimes (VAR COUNT [RESULT]) BODY...): loop a certain number of times.
+Evaluate BODY with VAR bound to successive integers running from 0,
+inclusive, to COUNT, exclusive.  Then evaluate RESULT to get
+the return value (nil if RESULT is omitted)."
+  (let ((temp (gensym "--dotimes-temp--")))
+    (list 'block nil
+	  (list* 'let (list (list temp (nth 1 spec)) (list (car spec) 0))
+		 (list* 'while (list '< (car spec) temp)
+			(append body (list (list 'incf (car spec)))))
+		 (or (cdr (cdr spec)) '(nil))))))
+
 (defsubst caar (x)
   "Return the car of the car of X."
   (car (car x)))