fork download
  1. ; sorting without duplicates, revisited
  2.  
  3. (define (split-while pred? xs)
  4. (let loop ((xs xs) (ys '()))
  5. (if (or (null? xs) (not (pred? (car xs))))
  6. (values (reverse ys) xs)
  7. (loop (cdr xs) (cons (car xs) ys)))))
  8.  
  9. (define (group-by pred? xs)
  10. (let loop ((xs xs) (zss (list)))
  11. (if (null? xs) (reverse zss)
  12. (call-with-values
  13. (lambda () (split-while (lambda (x) (pred? x (car xs))) xs))
  14. (lambda (head tail) (loop tail (cons head zss)))))))
  15.  
  16. (define (transpose xss)
  17. (if (null? xss) (list)
  18. (cons (map car xss) (transpose (filter pair? (map cdr xss))))))
  19.  
  20. (define (sort-no-dups xs)
  21. (apply append (transpose (group-by = (sort xs <)))))
  22.  
  23. (display (sort-no-dups '(2 9 1 5 1 4 9 7 2 1 4))) (newline)
Success #stdin #stdout 0.01s 8672KB
stdin
Standard input is empty
stdout
(1 2 4 5 7 9 1 2 4 9 1)