バブルソート習作

(defun do-bubble (list)
  (if (cdr list)
      (let ((t1 (car list)) (t2 (car (cdr list))))
	(if (> t1 t2)
	    (setf (car list) t2
		  (car (cdr list)) t1))
	(setf (cdr list) (do-bubble (cdr list)))))
  list)

(defun bubble-sort (list)
  (let ((ret-list))
    (dotimes (x (length list) ret-list)
      (setf list (do-bubble list)
	    ret-list (append (list (car (reverse list))) ret-list)
	    list (reverse (cdr (reverse list)))))))

; 結果
; * (bubble-sort '(3 1 4 6 2 5))
;
;(1 2 3 4 5 6)
; *

 dotimesで書いているところも再帰で記述しようとしたら、「ネスト深すぎ」とコンパイラに怒られた。