From 49046d53e05d35e3de7199d7978adc74a3a9d9be Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Sun, 5 Dec 2004 22:26:29 +0000 Subject: [PATCH] (map!): Change to a tail-recursive form. --- srfi/srfi-1.scm | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/srfi/srfi-1.scm b/srfi/srfi-1.scm index 1ff07a559..c7a821863 100644 --- a/srfi/srfi-1.scm +++ b/srfi/srfi-1.scm @@ -683,20 +683,21 @@ (define (map! f list1 . rest) (if (null? rest) - (let lp ((l list1)) - (if (null? l) - '() - (begin - (set-car! l (f (car l))) - (set-cdr! l (lp (cdr l))) - l))) - (let lp ((l (cons list1 rest)) (res list1)) - (if (any1 null? l) - '() - (begin - (set-car! res (apply f (map1 car l))) - (set-cdr! res (lp (map1 cdr l) (cdr res))) - res))))) + (let lp ((l list1)) + (if (null? l) + list1 + (begin + (set-car! l (f (car l))) + (lp (cdr l))))) + (let ((res (cons 123 list1))) + (let lp ((l (cons list1 rest)) (endcell res)) + (if (any1 null? l) + (begin + (set-cdr! endcell '()) ;; in case list1 was not the shortest + (cdr res)) + (begin + (set-car! (car l) (apply f (map1 car l))) + (lp (map1 cdr l) (car l)))))))) (define (pair-for-each f clist1 . rest) (if (null? rest)