我想要那种看起来像这样的列表: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