是否有一个通用的LISP函数来比较两个列表的内容?

是否有一个通用的LISP函数来比较两个列表的内容?,lisp,common-lisp,Lisp,Common Lisp,特别是,我只想确保两个列表具有相同的元素,忽略顺序。如果顺序不重要,可以使用equal。比如说, (equal (list 1 2) (list 1 2)) 这是真的。因此,一种方法是对列表进行排序,然后使用equal。请注意,排序是破坏性的,因此如果顺序很重要,您可能需要先复制它。如果重复项不重要,请参见SET-EXCLUSIVE-OR。根据Steele的说法,“SET difference返回列表1中未出现在列表2中的元素列表。此操作不是破坏性的。” 因此,如果集差为空且长度相同 对两个列

特别是,我只想确保两个列表具有相同的元素,忽略顺序。如果顺序不重要,可以使用equal。比如说,

(equal (list 1 2) (list 1 2))

这是真的。因此,一种方法是对列表进行排序,然后使用equal。请注意,排序是破坏性的,因此如果顺序很重要,您可能需要先复制它。

如果重复项不重要,请参见SET-EXCLUSIVE-OR。

根据Steele的说法,“SET difference返回列表1中未出现在列表2中的元素列表。此操作不是破坏性的。”

因此,如果集差为空且长度相同


对两个列表进行排序,然后比较:

(equal (sort l1 #'<) (sort l2 #'<))

(相等(排序l1#)”如果顺序不重要,可以使用“相等集”:

(相等集合
(12)
(12))->T

(相等集合
(12)
(21))->T

(相等集合
(1 2 5)
(1 2))->零


(相等集合
(12)
(15 2))->NIL

那么你可以说“(12)与“(12)具有相同的元素?取决于“相同元素”的含义。不过,我明白你的意思:如果我回答“是”,那么长度就无关紧要了。如果我回答“否”,设置差异并不能解决问题。不太相关,但要小心排序会破坏原始列表,因此此代码看起来很糟糕,因为在大多数情况下,你应该事先用例如<代码>(排序(复制列表l1)#'谢谢你的提醒。写这篇文章时,我在纯函数领域。顺序是否重要无关紧要——排序可能会破坏(而不是就地排序!)原始列表,因此在任何情况下复制都是一个好主意。如果顺序重要,排序(以及副本)将是不必要的;(等于X Y)就足够了。我想这就是重点。我在规范中找不到这个函数。你能链接到它吗?这不是一个常见的lisp函数,它只存在于你的想象中;-)
(equal (sort l1 #'<) (sort l2 #'<))
(defun list= (l1 l2 &key (test #'eql))
  (loop for i in l1
     for j in l2
     always (funcall test i j)))


(list= '(1 2 "a") '(1 2 "a") :test #'equal) ;; => T
(list= '(1 2 "a") '(1 2 "a") :test #'eql) ;; => NIL