From eb090229ee1cd6a2e9976670532e505eba595036 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Thu, 20 May 2010 21:57:33 +0200 Subject: [PATCH] The sequence iteration macros allow specifying the name of the index variable --- src/lsp/seqmacros.lsp | 45 +++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/lsp/seqmacros.lsp b/src/lsp/seqmacros.lsp index 15813bbd5..5033ca6a1 100644 --- a/src/lsp/seqmacros.lsp +++ b/src/lsp/seqmacros.lsp @@ -57,50 +57,53 @@ (defmacro reckless (&body body) `(locally (declare (optimize (safety 0) (speed 3) (debug 0))) ,@body)) -(defmacro do-vector ((elt vector start end &key from-end output) &body body) - (with-unique-names (%vector %i %count) +(defmacro do-vector ((elt vector start end + &key from-end output (index (gensym))) + &body body) + (with-unique-names (%vector %count) (if from-end `(do* ((,%vector ,vector) - (,%i ,end) + (,index ,end) (,%count ,start)) - ((= ,%i ,%count) ,output) - (declare (fixnum ,%i ,%count) + ((= ,index ,%count) ,output) + (declare (fixnum ,index ,%count) (vector ,%vector)) - (let ((,elt (reckless (aref ,%vector (setf ,%i (1- ,%i)))))) + (let ((,elt (reckless (aref ,%vector (setf ,index (1- ,index)))))) ,@body)) `(do* ((,%vector ,vector) - (,%i ,start (1+ ,%i)) + (,index ,start (1+ ,index)) (,%count ,end)) - ((= ,%i ,%count) ,output) - (declare (fixnum ,%i ,%count) + ((= ,index ,%count) ,output) + (declare (fixnum ,index ,%count) (vector ,%vector)) - (let ((,elt (reckless (aref ,%vector ,%i)))) + (let ((,elt (reckless (aref ,%vector ,index)))) ,@body))))) -(defmacro do-sublist ((elt list start end &key output) &body body) - (with-unique-names (%sublist %i %count) - `(do* ((,%i ,start) - (,%sublist (nthcdr ,%i ,list) (cdr ,%sublist)) - (,%count (- ,end ,%i) (1- ,%count))) +(defmacro do-sublist ((elt list start end &key output (index (gensym))) &body body) + (with-unique-names (%sublist %count) + `(do* ((,index ,start (1+ ,index)) + (,%sublist (nthcdr ,index ,list) (cdr ,%sublist)) + (,%count (- ,end ,index) (1- ,%count))) ((<= ,%count 0) ,output) - (declare (fixnum ,%i ,%count) + (declare (fixnum ,index ,%count) (cons ,%sublist)) (let ((,elt (car ,%sublist))) ,@body)))) -(defmacro do-sequence ((elt sequence start end &key output specialize) &body body) +(defmacro do-sequence ((elt sequence start end &key (index (gensym)) output specialize) + &body body) (if specialize (with-unique-names (%sequence) `(let ((,%sequence ,sequence)) (if (listp ,%sequence) - (do-sublist (,elt ,%sequence ,start ,end :output ,output) + (do-sublist (,elt ,%sequence ,start ,end :output ,output :index ,index) ,@body) - (do-vector (,elt ,%sequence ,start ,end :output ,output) + (do-vector (,elt ,%sequence ,start ,end :output ,output :index ,index) ,@body)))) (with-unique-names (%sequence %start %i %count) `(do* ((,%sequence ,sequence) - (,%start ,start) - (,%i (make-seq-iterator ,%sequence ,%start) + (,index ,start (1+ ,index)) + (,%i (make-seq-iterator ,%sequence ,index) (seq-iterator-next ,%sequence ,%i)) (,%count (- ,end ,start) (1- ,%count))) ((or (null ,%i) (not (plusp ,%count))) ,output)