
; results of evaluating functions are given in comments, starting with ;=> 

(defun quicksort (list)
  (cond ((consp list)
         (let ((p (car list))   ;; deconstructing list recursively
               (xs (cdr list)))
           (let ((lesser (remove-if  (lambda (x) (>= x p))
                                     xs))
                 (greater (remove-if (lambda (x) (< x p))
                                     xs)))
             (append (quicksort lesser) (list p) (quicksort greater)))))
        ((null list) ())
        (t :qs-error)))
;=> quicksort

(quicksort 1)
;=> :qs-error

(quicksort '(1))
;=> (1)

(quicksort '(1 5 2))
;=> (1 2 5)


