[utilities] compact sort-and-delete-duplicates

This is still readable IMHO. kons is the result constructor, and adds
item to result iff different from previous add.
This commit is contained in:
Christopher Lam 2019-09-10 00:34:25 +08:00
parent ff8c5725cd
commit 70cb3a0b97

View File

@ -188,12 +188,8 @@
;; uses quicksort internally. ;; uses quicksort internally.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define* (sort-and-delete-duplicates lst < #:optional (= =)) (define* (sort-and-delete-duplicates lst < #:optional (= =))
(let lp ((lst (sort lst <)) (result '())) (define (kons a b) (if (and (pair? b) (= a (car b))) b (cons a b)))
(cond (reverse (fold kons '() (sort lst <))))
((null? lst) '())
((null? (cdr lst)) (reverse (cons (car lst) result)))
((= (car lst) (cadr lst)) (lp (cdr lst) result))
(else (lp (cdr lst) (cons (car lst) result))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;