List Common Lisp:在给定指向嵌套列表的指针的情况下,从列表中删除该列表
我想知道,如果给定一个指向嵌套列表的指针,是否可以从列表中删除嵌套列表。例如,假设我们说List Common Lisp:在给定指向嵌套列表的指针的情况下,从列表中删除该列表,list,common-lisp,List,Common Lisp,我想知道,如果给定一个指向嵌套列表的指针,是否可以从列表中删除嵌套列表。例如,假设我们说 (defvar y '(1 2 3)) (defvar x (list 4 5 y 6 7)) 现在X是(45(123)67)。是否有一种方法可以使用Y将X修改为(4 5 6 7) 不会修改X,因此不会产生预期效果。我得到的最接近的是 (rplacd y nil) 它将X修改为(45(1)67) 编辑:在我希望解决的问题中,X是一个大而混乱的(在不同的地方有指针返回到它自己)。出于这个原因,我会努力避免
(defvar y '(1 2 3))
(defvar x (list 4 5 y 6 7))
现在X是(45(123)67)
。是否有一种方法可以使用Y将X修改为(4 5 6 7)
不会修改X,因此不会产生预期效果。我得到的最接近的是
(rplacd y nil)
它将X修改为(45(1)67)
编辑:在我希望解决的问题中,X是一个大而混乱的(在不同的地方有指针返回到它自己)。出于这个原因,我会努力避免搜索X来找到Y,然后删除Y。我相信,这排除了删除
第二次编辑:X必须就地修改。这也排除了DELETE,因为DELETE可能会修改X,也可能不会修改X。使用
DELETE
(setf x (delete y x))
虽然规范中说,delete
是允许的,但不是必需的,可以在我所知道的所有实现中修改列表。但是,您仍然必须将结果分配回变量以处理某些情况:
x
只有一个元素。结果是NIL
,这不能通过修改列表来实现y
是x
的第一个元素。许多delete
的实现都是通过更改前一个元素的cdr来工作的,在这种情况下没有前一个元素。因此,删除第一个元素的方法是返回第二个cons如果
y
是x
的第一个元素,那么就不会这样做了。在CLISP中尝试:(defvar x(列表1))(删除1x)(打印x)
@Gwang JinKim“破坏性”与“就地”不同。一个函数被定义为破坏性的,仅仅意味着它的保证较少(即共享结构不安全)。这并不意味着更多的保证,也就是说,它可以在适当的地方使用。我认为他要求的是不同的东西。他想更改列表,因为只有一个指向项目的指针,即“嵌套列表”。
(setf x (delete y x))