iteration.ss
;;;
;;; Time-stamp: <05/10/28 10:54:21 nhw>
;;;
;;; Copyright (C) 2005 by Noel Welsh.
;;;

;;; This library is free software; you can redistribute it
;;; and/or modify it under the terms of the GNU Lesser
;;; General Public License as published by the Free Software
;;; Foundation; either version 2.1 of the License, or (at
;;; your option) any later version.

;;; This library 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 Lesser General Public
;;; License for more details.

;;; You should have received a copy of the GNU Lesser
;;; General Public License along with this library; if not,
;;; write to the Free Software Foundation, Inc., 59 Temple
;;; Place, Suite 330, Boston, MA 02111-1307 USA

;;; Author: Noel Welsh <noelwelsh@yahoo.com>
;;
;;
;; Commentary:

;; Iteration macros
(module iteration mzscheme

  (provide for!
           for)

  (define-syntax for!
    (syntax-rules ()
      ((_ (counter start stop) expr ...)
       (let ((start-val start)
             (stop-val stop))
         (let loop ((counter start-val))
           (if (= counter stop-val)
               (void)
               (begin
                 expr ...
                 (loop (add1 counter)))))))))

  (define-syntax for
    (syntax-rules ()
      ((_ ((counter start stop) (accum seed) ...)
          expr ...)
       (let ((start-val start)
             (stop-val stop))
         (let loop ((counter start-val) (accum seed) ...)
           (if (= counter stop-val)
               (values accum ...)
               (call-with-values
                (lambda () expr ...)
                (lambda (accum ...)
                  (loop (add1 counter)
                        accum ...)))))))))

  )