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

标签 list lisp

我正在尝试在 lisp 中执行一个函数,该函数在给定特定 ID 的情况下从板上删除一个元素。我的棋盘是一个二维数组,在每个位置我都有这样的东西:(value (id x y)(id x y)...(id x y))。我必须删除每个 (id x y) 三元组,其中 id 等于函数调用中给出的 int。
我想出了一个可能非常糟糕的解决方案,它将板的内容复制到一个新的板中,除了具有指定 id 的元素。我试过在控制台上运行几个例子,它返回了正确的结果,但它并没有改变数组的内容。函数末尾的集合不应该正是这样做的吗?另外,我期望控制台结果是 TNIL 而不是修改后的板...

(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)))))

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

最佳答案

我认为您正在寻找的是 remove nondestructive 系列函数或 delete destructive 系列。 其中之一可以替换您的 dolist 循环。

更具体地说,你需要做类似的事情

(setf (board-content new-board x y) 
      (remove int (board-content old-board x y) :key #'car))

重要的部分是

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

(另请注意,您可以将两个 let 替换为单个 let*)。

关于list - 从具有特定 id lisp 的列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19908133/

相关文章:

python - count() 的奇怪执行时间

linux - 在 lisp 上使用 dolist 从列表中提取 n 元素

列表差异函数

oop - 列出 Common Lisp (CLOS) 中的对象方法

java - 此脚本中的 int 和 Integer 有什么区别?

java - 如何为具有不同属性的多个类调用过滤和排序方法?

clojure - 什么时候使用 Clojure 的闭包?

lisp - 堆栈弹出不返回

python - 创建相互独立的 Python 变量

list - 在 Groovy 中从另一个对象列表中减去一个对象列表的最佳方法是什么?