summaryrefslogtreecommitdiff
path: root/module/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2010-10-08 10:43:59 +0200
committerLudovic Courtès <ludo@gnu.org>2010-10-08 15:25:56 +0200
commita6505cb49c0971671bcdc87eb6abbc3204d94d97 (patch)
tree168ce0275aeb38c10b2eeab4a2bc1293b08b59a7 /module/srfi/srfi-1.scm
parent07076c1e61ab05b62979ee01a5220edb308b0750 (diff)
downloadguile-a6505cb49c0971671bcdc87eb6abbc3204d94d97.tar.gz
SRFI-1: Make `fold-right' tail-recursive.
* module/srfi/srfi-1.scm (fold-right): Make tail-recursive. * test-suite/tests/srfi-1.test ("fold-right"): New test prefix.
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r--module/srfi/srfi-1.scm20
1 files changed, 12 insertions, 8 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index 1e006c753..d6cefcdbd 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -419,14 +419,18 @@ that result. See the manual for details."
(define (fold-right kons knil clist1 . rest)
(if (null? rest)
- (let f ((list1 clist1))
- (if (null? list1)
- knil
- (kons (car list1) (f (cdr list1)))))
- (let f ((lists (cons clist1 rest)))
- (if (any null? lists)
- knil
- (apply kons (append! (map1 car lists) (list (f (map1 cdr lists)))))))))
+ (let loop ((lst (reverse clist1))
+ (result knil))
+ (if (null? lst)
+ result
+ (loop (cdr lst)
+ (kons (car lst) result))))
+ (let loop ((lists (map1 reverse (cons clist1 rest)))
+ (result knil))
+ (if (any1 null? lists)
+ result
+ (loop (map1 cdr lists)
+ (apply kons (append! (map1 car lists) (list result))))))))
(define (pair-fold kons knil clist1 . rest)
(if (null? rest)