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))