List 从具有特定id lisp的列表中删除元素

List 从具有特定id lisp的列表中删除元素,list,lisp,List,Lisp,我试图在lisp中执行一个函数,从给定特定id的电路板中删除一个元素。我的电路板是一个二维数组,在每个位置我都有如下内容:(value(id x y)(id x y)…(id x y))。我必须删除每个(id x y)三元组,其中id等于函数调用中给定的int。 我提出了一个可能非常糟糕的解决方案,它将电路板的内容复制到一个新的内容中,除了具有指定id的元素。我尝试在控制台上运行一些示例,它返回正确的结果,但不会更改数组的内容。函数末尾的集合不正是这样做的吗?另外,我还希望控制台结果是T或NIL

我试图在lisp中执行一个函数,从给定特定id的电路板中删除一个元素。我的电路板是一个二维数组,在每个位置我都有如下内容:
(value(id x y)(id x y)…(id x y))
。我必须删除每个
(id x y)
三元组,其中id等于函数调用中给定的int。
我提出了一个可能非常糟糕的解决方案,它将电路板的内容复制到一个新的内容中,除了具有指定id的元素。我尝试在控制台上运行一些示例,它返回正确的结果,但不会更改数组的内容。函数末尾的集合不正是这样做的吗?另外,我还希望控制台结果是
T
NIL
,而不是修改后的板

(defun remove-id (board int)
  (let ((lin (board-lines board))
        (col (board-columns board)))
    (let ((new-board (new-board lin col)))
      (dotimes (i lin)
        (dotimes (j col)
          (when (not (null (aref board i j)))
            (dolist (el (rest (aref board i j))
              (if (not (= (el-id el) int))
                (copy-content new-board (el-x el)(el-y el)))))))
      (setf board (copy-board new-board)))))

我使用的所有函数都能正常工作,我希望这些名称是不言自明的。

我想你要找的是非破坏性函数族或
delete
破坏性函数族。 其中一个可以替换
dolist
循环

更具体地说,你需要做一些像

(setf (board-content new-board x y) 
      (remove int (board-content old-board x y) :key #'car))
重要的部分是

  • :key
    参数(否则您将把
    int
    (id…
    )进行比较,而不是与
    id
    进行比较)
  • setf
    调用(因为
    remove
    不修改其序列参数)

  • (还请注意,您可以将两个
    let
    s替换为一个
    let*
    )。

    我已将第二个dotimes下面的行更改为:
    (删除obj(rest(aref board I j))
    。我在控制台上尝试了一个简单的例子,其中obj类似于
    (1(1(0.0)(1.1))
    ,我尝试删除id=1的对象。结果是零。。。