Move remf from unstable/list to racket/list.

Add remf* for consistency.
This commit is contained in:
Vincent St-Amour 2015-07-16 16:09:00 -05:00
parent c0408de912
commit 952df81877
3 changed files with 64 additions and 1 deletions

View File

@ -1312,6 +1312,32 @@ Computes the n-ary cartesian product of the given lists.
]
}
@defproc[(remf [pred procedure?]
[lst list?])
list?]{
Returns a list that is like @racket[lst], omitting the first element of @racket[lst]
for which @racket[pred] produces a true value.
@defexamples[
#:eval list-eval
(remf negative? '(1 -2 3 4 -5))
]
}
@defproc[(remf* [pred procedure?]
[lst list?])
list?]{
Like @racket[remf], but removes all the elements for which @racket[pred]
produces a true value.
@defexamples[
#:eval list-eval
(remf* negative? '(1 -2 3 4 -5))
]
}
@close-eval[list-eval]

View File

@ -616,4 +616,15 @@
(test '((1 2) (3 4) (4 3)) split*-list '(1 2 3 4) '(1 2 4 3) =)
(err/rt-test (split*-list '() '() #f))
;; ---------- remf / remf* ----------
(test '() remf positive? '())
(test '(-2 3 4 -5) remf positive? '(1 -2 3 4 -5))
(test '(1 3 4 -5) remf even? '(1 -2 3 4 -5))
(test '(1 -2 3 4 -5) remf (λ (x) #f) '(1 -2 3 4 -5))
(test '() remf* positive? '())
(test '(-2 -5) remf* positive? '(1 -2 3 4 -5))
(test '(1 3 -5) remf* even? '(1 -2 3 4 -5))
(test '(1 -2 3 4 -5) remf* (λ (x) #f) '(1 -2 3 4 -5))
(report-errs)

View File

@ -50,7 +50,9 @@
argmin
argmax
group-by
cartesian-product)
cartesian-product
remf
remf*)
(define (first x)
(if (and (pair? x) (list? x))
@ -747,3 +749,27 @@
(define (cp-2 as bs)
(for*/list ([i (in-list as)] [j (in-list bs)]) (cons i j)))
(foldr cp-2 (list (list)) ls))
(define (remf f ls)
(unless (list? ls)
(raise-argument-error 'remf "list?" ls))
(unless (and (procedure? f)
(procedure-arity-includes? f 1))
(raise-argument-error 'remf "(-> any/c any/c)" f))
(cond [(null? ls) '()]
[(f (car ls)) (cdr ls)]
[else
(cons (car ls)
(remf f (cdr ls)))]))
(define (remf* f ls)
(unless (list? ls)
(raise-argument-error 'remf* "list?" ls))
(unless (and (procedure? f)
(procedure-arity-includes? f 1))
(raise-argument-error 'remf* "(-> any/c any/c)" f))
(cond [(null? ls) '()]
[(f (car ls)) (remf* f (cdr ls))]
[else
(cons (car ls)
(remf* f (cdr ls)))]))