(defun quicksort (list less)
(if (null (cdr list))
list
(let ((pivot (car list))
(smaller '())
(equal '())
(greater '())
(temp nil))
(loop until (null list)
do (setf temp list
list (cdr list))
(cond ((funcall less (car temp) pivot)
(setf (cdr temp) smaller
smaller temp))
((funcall less pivot (car temp))
(setf (cdr temp) greater
greater temp))
(t
(setf (cdr temp) equal
equal temp))))
(nconc (quicksort smaller less)
equal
(quicksort greater less)))))