fix the fix for `slicef-at`

pull/2/head
Matthew Butterick 10 years ago
parent dc2b29c758
commit b987bacfe4

@ -11,14 +11,13 @@
(define+provide/contract (slicef-at xs pred [force? #f])
((list? procedure?) (boolean?) . ->* . list-of-lists?)
(define-values (last-list list-of-lists _)
(for/fold ([current-list empty][list-of-lists empty][previous-x-was-pred #f])([x (in-list xs)])
(define pred-x (pred x))
(if (and (not previous-x-was-pred) pred-x)
(define-values (last-list list-of-lists)
(for/fold ([current-list empty][list-of-lists empty])([x (in-list xs)])
(if (pred x)
(values (cons x null) (if (not (empty? current-list))
(cons (reverse current-list) list-of-lists)
list-of-lists) pred-x)
(values (cons x current-list) list-of-lists pred-x))))
list-of-lists))
(values (cons x current-list) list-of-lists))))
(let ([list-of-lists (reverse (if (empty? last-list)
list-of-lists
(cons (reverse last-list) list-of-lists)))])

@ -64,6 +64,7 @@ Divide @racket[_lst] into sublists starting with elements matching @racket[_pred
@examples[#:eval my-eval
(slicef-at (range 5) even?)
(slicef-at '(1 2 2 1 2) even?)
(slicef-at (range 5) odd?)
(slicef-at (range 5) odd? #t)]

@ -157,7 +157,8 @@
(check-equal? (slicef-at (range 5) procedure?) '((0 1 2 3 4)))
(check-exn exn:fail:contract? (λ() (slicef-at (range 5) 3)))
(check-equal? (slicef-at '(1 2) integer?) '((1 2)))
(check-equal? (slicef-at '(1 2 2 1 2) even?) '((1) (2) (2 1) (2)))
(check-equal? (slicef-at '(1 2 2 1 2) even? #t) '((2) (2 1) (2)))
(check-equal? (sublist (range 5) 0 0) '())
(check-equal? (sublist (range 5) 0 1) '(0))

Loading…
Cancel
Save