list - 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。
解决方案
利用delete
(setf x (delete y x))
虽然规范说delete
允许但不是必须修改列表,但它确实在我知道的所有实现中都进行了修改。但是,您仍然必须将结果分配回变量以处理某些情况:
x
只有 1 个元素。结果是NIL
,而这不能通过就地修改列表来实现。y
是 的第一个元素x
。许多实现delete
通过更改前一个元素的 cdr 来工作,在这种情况下没有前一个元素。因此,通过返回第二个缺点来删除第一个元素。
推荐阅读
- docker - 有没有办法在 docker swarm 中运行备用服务?
- php - Wordpress:循环内的 preg_replace 仅偶尔有效
- c++ - 在构造函数中被删除后继续执行
- javascript - Prism.js - 如何获得在 / 使用 prism 的链接?
- java - 使用java将pairRDD转换为spark中的数据集
- indexeddb - 我们如何更新 IndexedDB 中的键路径值
- reactjs - 我正在寻找如何在材料 ui 的表格组件上绘制垂直线
- google-bigquery - 在 BigQuery 中将字符串转换为日期的最佳方法是什么?
- python - 查找特定列的平均值并保留所有具有特定平均值的行
- ansible - Ansible 成为用户无法运行命令