summaryrefslogtreecommitdiff
path: root/srfi
diff options
context:
space:
mode:
authorGary Houston <ghouston@arglist.com>2001-08-04 18:37:08 +0000
committerGary Houston <ghouston@arglist.com>2001-08-04 18:37:08 +0000
commit848458d99068f7542b5f63d52eb2338595a5fb1e (patch)
treee0e3ac71c4a797fb121ccfaae8385b9ffc347722 /srfi
parent3524efbcd9f45174a4fec6a1802697531f63cc97 (diff)
downloadguile-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/ChangeLog5
-rw-r--r--srfi/srfi-1.scm20
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