如何在 Common Lisp 中按特定顺序对列表进行排序?

How to sort a list by a certain order in Common Lisp?

所以我知道如何对 (1 2 3) 这样的列表进行排序 例如在 Common Lisp 中按升序排列。

但是我需要对这个列表进行排序:( (1 2 3) nil 1) 按照 3rd 元素的降序排列。

有办法吗?

sort 函数接受一个谓词,该谓词将用于判断一个元素何时在另一个元素之前(参见 hyperspec)。

所以,定义一个函数compare-3rd:

(defun compare-3rd (a b)
  (< (nth 2 a) (nth 2 b)))

并将其用作谓词:

(sort '(( (1 2 3) nil 4)
    ( (1 2 3) nil 2)
    ( (1 2 3) nil 3))
      'compare-3rd)

==> (((1 2 3) NIL 2) ((1 2 3) NIL 3) ((1 2 3) NIL 4))

当然,如果你想要降序,你可以使用 > 而不是 compare-3rd 中的 <