我想要那種看起來像這樣的列表:Lisp的排序功能鍵
(defvar my-list '((:x 1 :y something) (:x 5 :y something) (:x 19 :y something)))
我試圖通過:x
值來排序。我是這樣做的
(sort my-list #'> :key #'second)
,但我非常喜歡使用的,而不是second
的getf
功能,但我無法弄清楚如何通過:x
作爲參數。
從我可以收集只是#'getf
回報(getf ((:x 1 :y something) '(:x 5 :y something) (:x 19 :y something)) [external]
。我會如何去通過:x
作爲第二個參數?
我能想到的唯一方法是爲getf
創建一個包裝函數,它僅將一個列表作爲參數,並在默認情況下通過:x
。但必須有更好的方法。
您不需要引用引用列表中的子列表。另外,你不應該在引用(文字)列表中使用像'SORT'這樣的破壞性操作。在排序之前,您可以使用「COPY-LIST」(或「COPY-TREE」)複製列表。對於問題本身,製作包裝函數是通常的解決方案。這通常被稱爲咖喱。 [亞歷山大](https://common-lisp.net/project/alexandria/)庫具有函數'CURRY'和'RCURRY'。 – jkiiski
@jkiiski,我不知道那裏有什麼引號,你完全正確。至於解決方案本身:你可能是正確的爲好,但我會推遲宣佈這一解決,以防萬一有一個更好的(我指的是更雄辯)解決方案。 – Kamarutu
一種替代是使用結構(可能具有'(:類型列表)'),在這種情況下,可以使用訪問器的插槽。 – jkiiski