;;; -------------------------------------------------------------------
;;; -------------------------------------------------------------------
;;; --- Return those numbers of list l that compare
;;;
(define cmp-extract
(lambda (p op l)
(if (null? l)
l
(if (op (car l) p)
(cons (car l) (cmp-extract p op (cdr l)))
(cmp-extract p op (cdr l))))))
;;; --- The Quick Sort Program in Scheme
;;;
(define quick
(lambda (l)
(if (null? l)
l
(let ((pivot (car l)))
(let ((lower (quick (cmp-extract pivot < l)))
(middle (cmp-extract pivot = l))
(upper (quick (cmp-extract pivot > l))))
(append lower middle upper))))))