From 848458d99068f7542b5f63d52eb2338595a5fb1e Mon Sep 17 00:00:00 2001 From: Gary Houston Date: Sat, 4 Aug 2001 18:37:08 +0000 Subject: [PATCH] * srfi-1.scm (filter): replaced with a tail-recursive version. (remove): implement using filter, to make it tail-recursive. --- srfi/ChangeLog | 5 +++++ srfi/srfi-1.scm | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/srfi/ChangeLog b/srfi/ChangeLog index 109ff9940..d4b650181 100644 --- a/srfi/ChangeLog +++ b/srfi/ChangeLog @@ -1,3 +1,8 @@ +2001-08-04 Gary Houston + + * srfi-1.scm (filter): replaced with a tail-recursive version. + (remove): implement using filter, to make it tail-recursive. + 2001-07-31 Gary Houston * srfi-14.c (scm_char_set_diff_plus_intersection): wasn't correctly diff --git a/srfi/srfi-1.scm b/srfi/srfi-1.scm index 4c361a57e..cd2ca757d 100644 --- a/srfi/srfi-1.scm +++ b/srfi/srfi-1.scm @@ -720,11 +720,15 @@ ;;; Filtering & partitioning (define (filter pred list) - (if (null? list) - '() - (if (pred (car list)) - (cons (car list) (filter pred (cdr list))) - (filter pred (cdr list))))) + (letrec ((filiter (lambda (pred rest result) + (if (null? rest) + (reverse! result) + (filiter pred (cdr rest) + (cond ((pred (car rest)) + (cons (car rest) result)) + (else + result))))))) + (filiter pred list '()))) (define (partition pred list) (if (null? list) @@ -736,11 +740,7 @@ (values in (cons (car list) out)))))) (define (remove pred list) - (if (null? list) - '() - (if (pred (car list)) - (remove pred (cdr list)) - (cons (car list) (remove pred (cdr list)))))) + (filter (lambda (x) (not (pred x))) list)) (define (filter! pred list) (filter pred list)) ; XXX:optimize