; sorting without duplicates, revisited (define (split-while pred? xs) (let loop ((xs xs) (ys '())) (if (or (null? xs) (not (pred? (car xs)))) (values (reverse ys) xs) (loop (cdr xs) (cons (car xs) ys))))) (define (group-by pred? xs) (let loop ((xs xs) (zss (list))) (if (null? xs) (reverse zss) (call-with-values (lambda () (split-while (lambda (x) (pred? x (car xs))) xs)) (lambda (head tail) (loop tail (cons head zss))))))) (define (transpose xss) (if (null? xss) (list) (cons (map car xss) (transpose (filter pair? (map cdr xss)))))) (define (sort-no-dups xs) (apply append (transpose (group-by = (sort xs <))))) (display (sort-no-dups '(2 9 1 5 1 4 9 7 2 1 4))) (newline)