(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)))))