diff options
author | Gary Houston <ghouston@arglist.com> | 2001-08-04 18:37:08 +0000 |
---|---|---|
committer | Gary Houston <ghouston@arglist.com> | 2001-08-04 18:37:08 +0000 |
commit | 848458d99068f7542b5f63d52eb2338595a5fb1e (patch) | |
tree | e0e3ac71c4a797fb121ccfaae8385b9ffc347722 /srfi | |
parent | 3524efbcd9f45174a4fec6a1802697531f63cc97 (diff) | |
download | guile-848458d99068f7542b5f63d52eb2338595a5fb1e.tar.gz |
* srfi-1.scm (filter): replaced with a tail-recursive version.
(remove): implement using filter, to make it tail-recursive.
Diffstat (limited to 'srfi')
-rw-r--r-- | srfi/ChangeLog | 5 | ||||
-rw-r--r-- | 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 <ghouston@arglist.com> + + * srfi-1.scm (filter): replaced with a tail-recursive version. + (remove): implement using filter, to make it tail-recursive. + 2001-07-31 Gary Houston <ghouston@arglist.com> * 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 |