どう書く?org ;n人中m人が当選するくじ を commonlispで

例外処理はいいかげん。
なんだか汚いソースだなぁ・・・。

;;n人中m人が当選するくじ
(defun make-targets(n)
  (let ((arr (make-array n)))
    (reduce #'(lambda (ar i)
        (if (null ar)
            (list "0")
          (append ar (list (princ-to-string (length ar))))))
        arr
        :initial-value nil)))

(defun lot(n m)
  (labels ((choice (vec)
           (elt vec (random (length vec) (make-random-state t))))
;;           (elt vec (random (length vec))))
       (pick (vec item hits)
         (values (remove item vec) (append hits (list item))))
       (lot_ (vec hits)
         (print vec)
         (if (= (length hits) m)
             nil
           (let ((item (choice vec)))
             (multiple-value-bind (rvec rhits) (pick vec item hits)
               (cons item (lot_ rvec rhits)))))))
    (sort (lot_ (make-targets n) nil) #'string<)))