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

标签 lisp common-lisp

我想用 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/

相关文章:

loops - Common Lisp - 将函数应用于列表中的每个其他元素

syntax-error - Lisp - 替换列表中元素的所有外观

lisp - 将 Common Lisp 代码移植到 Clojure

common-lisp - 简单的 http 用法

nested - 通用 Lisp : Appending a nested plist efficiently

functional-programming - 排列闭包树的输出

functional-programming - 我为什么要学习 Lisp?

lisp - 普通口齿不清, "defined but never used"

ssh - 不使用 SSH 连接到远程 lisp

common-lisp - 我可以在他们的扩展站点中获取宏的边界吗?