diff options
Diffstat (limited to 'chickadee/utils.scm')
-rw-r--r-- | chickadee/utils.scm | 24 |
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 ...))))) |