0

我正在尝试在 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)))))

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

4

1 回答 1

1

我认为您正在寻找的是非破坏性功能系列或破坏性系列。其中之一可以替换您的循环。remove delete 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用一个 s 替换两个 s let*)。

于 2013-11-11T14:32:21.047 回答