首页 > 解决方案 > Common Lisp:从给定指针的列表中删除嵌套列表

问题描述

我想知道是否可以从列表中删除嵌套列表,给定一个指向嵌套列表的指针。例如,假设我们说

(defvar y '(1 2 3))
(defvar x (list 4 5 y 6 7))

现在 X 是(4 5 (1 2 3) 6 7)。有没有办法使用 Y 将 X 修改为(4 5 6 7)

(setf y nil)

不修改X,所以没有预期的效果。我得到的最接近的是

(rplacd y nil)

将 X 修改为(4 5 (1) 6 7).

编辑:在我希望解决的问题中,X 很大而且很乱(在各个地方都有指向自身的指针)。出于这个原因,我会尽量避免搜索 X 以找到 Y,然后删除 Y。我相信,这排除了 DELETE。

第二次编辑:X 必须就地修改。这也排除了 DELETE,因为 DELETE 可能会或可能不会修改 X。

标签: listcommon-lisp

解决方案


利用delete

(setf x (delete y x))

虽然规范说delete允许但不是必须修改列表,但它确实在我知道的所有实现中都进行了修改。但是,您仍然必须将结果分配回变量以处理某些情况:

  1. x只有 1 个元素。结果是NIL,而这不能通过就地修改列表来实现。
  2. y是 的第一个元素x。许多实现delete通过更改前一个元素的 cdr 来工作,在这种情况下没有前一个元素。因此,通过返回第二个缺点来删除第一个元素。

推荐阅读