Tri par fusion en Lisp

(defun merge-sort (list less)
  (labels ((merge-lists (list1 list2)
             (loop until (and (null list1) (null list2))
                   if (null list1) 
                     collect (pop list2)
                   else if (null list2)
                     collect (pop list1)
                   else if (funcall less (car list1) (car list2))
                     collect (pop list1)
                   else 
                     collect (pop list2)))
           (sort-aux (list length)
             (if (< length 2)
                 list
                 (let* ((half-length (floor length 2))
                        (rest-length (- length half-length))
                        (temp (nthcdr (1- half-length) list))
                        (rest (cdr temp)))
                   (setf (cdr temp) nil)
                   (merge-lists (sort-aux list half-length)
                                (sort-aux rest rest-length))))))
    (sort-aux list (length list))))