summaryrefslogtreecommitdiff
path: root/chickadee/utils.scm
diff options
context:
space:
mode:
Diffstat (limited to 'chickadee/utils.scm')
-rw-r--r--chickadee/utils.scm24
1 files changed, 23 insertions, 1 deletions
diff --git a/chickadee/utils.scm b/chickadee/utils.scm
index 4f989ac..e2a20c1 100644
--- a/chickadee/utils.scm
+++ b/chickadee/utils.scm
@@ -17,7 +17,8 @@
;;; <http://www.gnu.org/licenses/>.
(define-module (chickadee utils)
- #:export (memoize))
+ #:export (memoize
+ for-range))
;; Written by Ludovic Courtès. Taken from GNU Guix.
(define (memoize proc)
@@ -31,3 +32,24 @@
list)))
(hash-set! cache args results)
(apply values results)))))))
+
+(define-syntax for-range
+ (syntax-rules ()
+ ((_ ((var end start inc)) body ...)
+ (let* ((s start) ; evaluate start/end only once
+ (e end)
+ (reverse? (< e s))
+ (start* (if reverse? e s))
+ (end* (if reverse? s e)))
+ (let loop ((var start*))
+ (when (< var end*)
+ body ...
+ (loop (+ var inc))))))
+ ((_ ((var end start)) body ...)
+ (for-range ((var end start 1)) body ...))
+ ((_ ((var end)) body ...)
+ (for-range ((var end 0 1)) body ...))
+ ((_ ((var args ...) rest ...) body ...)
+ (for-range ((var args ...))
+ (for-range (rest ...)
+ body ...)))))