Tri rapide sur une liste en Lisp

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