diff options
author | Ludovic Courtès <ludo@gnu.org> | 2010-10-08 10:43:59 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2010-10-08 15:25:56 +0200 |
commit | a6505cb49c0971671bcdc87eb6abbc3204d94d97 (patch) | |
tree | 168ce0275aeb38c10b2eeab4a2bc1293b08b59a7 /module/srfi/srfi-1.scm | |
parent | 07076c1e61ab05b62979ee01a5220edb308b0750 (diff) | |
download | guile-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.scm | 20 |
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) |