(define-simple-class () (compare init-keyword: compare:) ((compare (o1 :: ) (o2 :: )) :: ((slot-ref (this) 'compare) o1 o2))) (define (sort-compare! sequence compare) (let ((comparator (make compare: compare))) (invoke-static 'sort sequence comparator) sequence)) (define (copy-list sequence) (apply list sequence)) (define (copy-vector vec) (apply vector vec)) (define (sort-compare sequence compare) (if (list? sequence) (sort-compare! (copy-list sequence) compare) (sort-compare! (copy-vector sequence) compare))) (define (sort! sequence less?) (define (compare o1 o2) (if (less? o1 o2) -1 1)) (sort-compare sequence compare)) (define (sort sequence less?) (if (list? sequence) (sort! (copy-list sequence) less?) (sort! (copy-vector sequence) less?)))