Lisp-从另一对列表中删除对列表的实例

Lisp-从另一对列表中删除对列表的实例,lisp,common-lisp,Lisp,Common Lisp,我想在lisp中编写一个函数,它获取两个成对列表,并从第二个列表中删除第一个列表的所有匹配项。 例如,如果我们有list1((ab)(cd))和list2((gh)(ab)(ji)),通过调用此函数,结果将是((gh)(ji)) 到目前为止,我有以下代码(不起作用): 其中,如果第一个列表中的对象等于第二个列表中的对象,则retira应删除列表中对象的所有引用,并且retira ocupadas应注意比较Todos ocupados是一个生成第一个列表的函数 这目前不起作用,我做错了什么?这就是

我想在lisp中编写一个函数,它获取两个成对列表,并从第二个列表中删除第一个列表的所有匹配项。 例如,如果我们有
list1((ab)(cd))
list2((gh)(ab)(ji))
,通过调用此函数,结果将是
((gh)(ji))

到目前为止,我有以下代码(不起作用):

其中,如果第一个列表中的对象等于第二个列表中的对象,则
retira
应删除列表中对象的所有引用,并且
retira ocupadas
应注意比较
Todos ocupados
是一个生成第一个列表的函数


这目前不起作用,我做错了什么?

这就是你想要做的吗

(defun multi-remove (a b)
  (loop for e in b
        do (setf a (remove e a)))

这将遍历b的每个元素,并以破坏性方式删除a中出现的所有元素。

您希望删除作为第一个列表成员的第二个列表中的任何元素

(defun remove-list (list-to-remove target-list)
  (remove-if (lambda (element)
               (member element list-to-remove
                       :test #'equal))
             target-list))

请注意
equal
的定义,也许您想要
equalp
(或者您需要编写自己的
pair equal
)。

将执行此操作,但不一定保留列表的顺序:

? (let ((list1 '((a b) (c d)))
        (list2 '((g h) (a b) (j i))))
    (set-difference list2 list1 :test 'equal))
((J I) (G H))
例如:

CL-USER > (list-difference '((g h) (a b) (j i))
                           '((a b) (cd))
                           :test #'equal)
((G H) (J I))

哦,很抱歉,todos ocupados是一个生成第一个列表的函数。但是retire ocupadas会传递调用todos ocupados的结果,然后对该结果应用T-O(每次递归调用)。您能否更具体地说明它的行为与期望的行为有何不同?这是一个家庭作业吗?无论如何,您应该查看
remove if
member
。但是,您应该在代码中使用英语,特别是当您将其粘贴到国际网站上时。@CláudioRibeiro:Cl有很多函数可以操作列表,您应该使用它们,而不是滚动自己的列表(除非您真的想实现它们)。我再说一遍,玩一下
remove if
member
。(提示:默认的
:test
函数可能不会执行您想要的操作,但您可以对其进行更改)或者对于非破坏性(功能更强大的样式)选项:
(defun multiRemove(ab)(car(last(mapcar#’)(lambda(e)(setf a(remove ea)))
不。在您的回答中,函数中的变量
a
被修改,但Lisp是按值传递的。在你的评论中,你需要给出一个不同的
:test
参数来
remove
,这是
mapcar
的一个相当复杂的用法(还有许多其他的“循环”结构更适合这里)。哦,与问题相比,你交换了这两个参数的含义。这是一篇很好的文章,解释了为什么平等并不简单,以及为什么有这么多函数来处理它。
(defun list-difference (list1 list2 &key (test #'eql))
  (loop for item in list1
        unless (member item list2 :test test)
        collect item))
CL-USER > (list-difference '((g h) (a b) (j i))
                           '((a b) (cd))
                           :test #'equal)
((G H) (J I))