1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-11 22:31:12 +02:00

* srfi-1.scm (filter): replaced with a tail-recursive version.

(remove): implement using filter, to make it tail-recursive.
This commit is contained in:
Gary Houston 2001-08-04 18:37:08 +00:00
parent 3524efbcd9
commit 848458d990
2 changed files with 15 additions and 10 deletions

View file

@ -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> 2001-07-31 Gary Houston <ghouston@arglist.com>
* srfi-14.c (scm_char_set_diff_plus_intersection): wasn't correctly * srfi-14.c (scm_char_set_diff_plus_intersection): wasn't correctly

View file

@ -720,11 +720,15 @@
;;; Filtering & partitioning ;;; Filtering & partitioning
(define (filter pred list) (define (filter pred list)
(if (null? list) (letrec ((filiter (lambda (pred rest result)
'() (if (null? rest)
(if (pred (car list)) (reverse! result)
(cons (car list) (filter pred (cdr list))) (filiter pred (cdr rest)
(filter pred (cdr list))))) (cond ((pred (car rest))
(cons (car rest) result))
(else
result)))))))
(filiter pred list '())))
(define (partition pred list) (define (partition pred list)
(if (null? list) (if (null? list)
@ -736,11 +740,7 @@
(values in (cons (car list) out)))))) (values in (cons (car list) out))))))
(define (remove pred list) (define (remove pred list)
(if (null? list) (filter (lambda (x) (not (pred x))) list))
'()
(if (pred (car list))
(remove pred (cdr list))
(cons (car list) (remove pred (cdr list))))))
(define (filter! pred list) (define (filter! pred list)
(filter pred list)) ; XXX:optimize (filter pred list)) ; XXX:optimize