リストをソートする - lisp-cookbook-ja/common-lisp GitHub Wiki

リスト

リストを並べ替えるには、sort 関数を使います。sort 関数は引数のリストを破壊的に変更します。よって、新たなリストを得るには copy-list を使います。第1引数に並べ替えたいリスト、第2引数に比較に使う関数( #'< など)を指定します。

(let ((my-list '(2 3 1 5 4)))
  (sort (copy-list my-list) #'<))
;=> (1 2 3 4 5)

比較に使う関数を変えれば、逆順に並べ替えたり、特殊な並べ替えをすることもできます。

;; 逆順に並び替える
(let ((my-list '(2 3 1 5 4)))
             (sort (copy-list my-list) #'>))
;=> (5 4 3 2 1)

;; 各要素の絶対値で並び替える
(let ((my-list '(-2 3 5 1 -7 -4)))
  (sort (copy-list my-list) 
        #'(lambda (a b) (< (abs a) (abs b)))))
;=> (1 -2 3 -4 5 -7)

また、:key キーワードを使うと、比較関数に渡される前に要素に対して適用される関数を指定できます。上記の絶対値の例は、以下のように書いても同等です

(let ((my-list '(-2 3 5 1 -7 -4)))
  (sort (copy-list my-list) #'< :key #'abs))
;=> (1 -2 3 -4 5 -7)

このように、第2引数の比較関数と :key キーワードパラメーターを用いることで、複雑なソートを簡潔に書くことができます。