From 952df818772f38cd0866983b5bfc1b61b94d70d5 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Thu, 16 Jul 2015 16:09:00 -0500 Subject: [PATCH] Move remf from unstable/list to racket/list. Add remf* for consistency. --- .../scribblings/reference/pairs.scrbl | 26 +++++++++++++++++ pkgs/racket-test-core/tests/racket/list.rktl | 11 ++++++++ racket/collects/racket/list.rkt | 28 ++++++++++++++++++- 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-doc/scribblings/reference/pairs.scrbl b/pkgs/racket-doc/scribblings/reference/pairs.scrbl index 0803e22e35..d55b0447a1 100644 --- a/pkgs/racket-doc/scribblings/reference/pairs.scrbl +++ b/pkgs/racket-doc/scribblings/reference/pairs.scrbl @@ -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] diff --git a/pkgs/racket-test-core/tests/racket/list.rktl b/pkgs/racket-test-core/tests/racket/list.rktl index e718fa1f51..4ead034251 100644 --- a/pkgs/racket-test-core/tests/racket/list.rktl +++ b/pkgs/racket-test-core/tests/racket/list.rktl @@ -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) diff --git a/racket/collects/racket/list.rkt b/racket/collects/racket/list.rkt index b7c711f559..3e8b1a3d0b 100644 --- a/racket/collects/racket/list.rkt +++ b/racket/collects/racket/list.rkt @@ -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)))]))