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

时间:2013-11-11 13:56:15

标签: 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)))))

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

1 个答案:

答案 0 :(得分: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不会修改其序列参数)
  3. (另请注意,您可以使用一个let替换两个let*