我想用 lisp 编写一个函数,它接受两个成对的列表,并从第二个列表中删除所有出现的第一个列表。
例如,如果我们有 list1 ((a b)(cd))
和 list2 ((g h)(a b)(j i))
,通过调用这个函数得到结果将是 ((g h)(j i))
。
到目前为止,我有以下代码(无法正常工作):
(defun retira(obj l1)
(cond ((null l1) ())
((equal obj (first l1)) (retira obj (rest l1)))
(t (cons (first l1) (retira obj (rest l1))))))
(defun retira-ocupadas (tabuleiro lista-adj)
(if (equal (first (todos-ocupados tabuleiro)) (first lista-adj))
(retira (car (todos-ocupados tabuleiro)) lista-adj))
(retira-ocupadas (rest (todos-ocupados tabuleiro)) (rest lista-adj)))
retira
应该删除列表中所有出现的对象,如果第一个列表中的对象等于第二个列表中的对象。 Todos-ocupados
是生成第一个列表的函数。
这目前不起作用,我做错了什么?
最佳答案
您想删除第二个列表中属于第一个列表的任何元素。
(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
)。
关于Lisp - 从另一个对列表中删除一个对列表的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734415/