; 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)
OyBzb3J0aW5nIHdpdGhvdXQgZHVwbGljYXRlcywgcmV2aXNpdGVkCgooZGVmaW5lIChzcGxpdC13aGlsZSBwcmVkPyB4cykKICAobGV0IGxvb3AgKCh4cyB4cykgKHlzICcoKSkpCiAgICAoaWYgKG9yIChudWxsPyB4cykgKG5vdCAocHJlZD8gKGNhciB4cykpKSkKICAgICAgICAodmFsdWVzIChyZXZlcnNlIHlzKSB4cykKICAgICAgICAobG9vcCAoY2RyIHhzKSAoY29ucyAoY2FyIHhzKSB5cykpKSkpCgooZGVmaW5lIChncm91cC1ieSBwcmVkPyB4cykKICAobGV0IGxvb3AgKCh4cyB4cykgKHpzcyAobGlzdCkpKQogICAgKGlmIChudWxsPyB4cykgKHJldmVyc2UgenNzKQogICAgICAoY2FsbC13aXRoLXZhbHVlcwogICAgICAgIChsYW1iZGEgKCkgKHNwbGl0LXdoaWxlIChsYW1iZGEgKHgpIChwcmVkPyB4IChjYXIgeHMpKSkgeHMpKQogICAgICAgIChsYW1iZGEgKGhlYWQgdGFpbCkgKGxvb3AgdGFpbCAoY29ucyBoZWFkIHpzcykpKSkpKSkKCihkZWZpbmUgKHRyYW5zcG9zZSB4c3MpCiAgKGlmIChudWxsPyB4c3MpIChsaXN0KQogICAgKGNvbnMgKG1hcCBjYXIgeHNzKSAodHJhbnNwb3NlIChmaWx0ZXIgcGFpcj8gKG1hcCBjZHIgeHNzKSkpKSkpCgooZGVmaW5lIChzb3J0LW5vLWR1cHMgeHMpCiAgKGFwcGx5IGFwcGVuZCAodHJhbnNwb3NlIChncm91cC1ieSA9IChzb3J0IHhzIDwpKSkpKQoKKGRpc3BsYXkgKHNvcnQtbm8tZHVwcyAnKDIgOSAxIDUgMSA0IDkgNyAyIDEgNCkpKSAobmV3bGluZSk=