Lisp 如何从列表中删除子列表?

Lisp 如何从列表中删除子列表?,lisp,common-lisp,Lisp,Common Lisp,我想从我的列表中删除一个特殊列表。但是函数remove不能解决这个问题 这是为了在列表中进行深入搜索,我想把它扔掉。我用函数remove尝试了它,但它不起作用 (DEFPARAMETER WB '((HALLWAY EAST OFFICE) (OFFICE WEST HALLWAY) (OFFICE NORTH KITCHEN) (KITCHEN SOUTH OFFICE) (BEDROOM WEST GARDEN) (GARDEN EAST BEDROOM) (GARDEN WEST OFFI

我想从我的列表中删除一个特殊列表。但是函数remove不能解决这个问题

这是为了在列表中进行深入搜索,我想把它扔掉。我用函数remove尝试了它,但它不起作用

(DEFPARAMETER WB '((HALLWAY EAST OFFICE) (OFFICE WEST HALLWAY) (OFFICE NORTH KITCHEN) (KITCHEN SOUTH OFFICE) (BEDROOM WEST GARDEN) (GARDEN EAST BEDROOM) (GARDEN WEST OFFICE) (OFFICE EAST GARDEN) (GARDEN NORTH BATHROOM) (BATHROOM SOUTH GARDEN) (LAVATORY SOUTH BEDROOM) (BEDROOM NORTH LAVATORY) (LAVATORY WEST BATHROOM) (BATHROOM EAST LAVATORY) (BATHROOM WEST KITCHEN) (KITCHEN EAST BATHROOM) (STUDIO EAST KITCHEN) (KITCHEN WEST STUDIO) (STUDIO SOUTH HALLWAY) (HALLWAY NORTH STUDIO)))

(REMOVE '(BATHROOM EAST KITCHEN) WB) ;should throw (BATHROOM EAST KITCHEN) out of WB but does not work 
接受测试函数参数的函数中的:test关键字参数的默认值为

当您写入删除“1 2 3”1 2 3 4 5 6时,无法保证打印为1 2 3的两个列表是相同的。它们可能由不同的cons单元格表示:

(eql '(1 2 3) '(1 2 3))
=> NIL
编译器可以在编译时检测到两个列表相等,并使用相同的底层内存,使它们相等,但通常不能假设情况是这样

但是,如果您使用了两次相同的列表,则REMOVE将按预期工作:

(let ((a '(1 2 3))) (remove a (list a '(4 5 6))))
=> ((4 5 6))
上面的示例也可以使用读取器变量编写如下。结果类似,但整个列表在运行时被引用,而不是使用list创建:

在一般情况下,如果不按对象的标识操纵对象,则需要使用知道如何比较列表的测试函数,以便将具有相同内容的不同列表视为相等:

(remove '(1 2 3) '((1 2 3) (4 5 6)) :test #'equal)
=> ((4 5 6))
使用上述代码,将元素与进行比较。

接受测试函数参数的函数中:test关键字参数的默认值为

当您写入删除“1 2 3”1 2 3 4 5 6时,无法保证打印为1 2 3的两个列表是相同的。它们可能由不同的cons单元格表示:

(eql '(1 2 3) '(1 2 3))
=> NIL
编译器可以在编译时检测到两个列表相等,并使用相同的底层内存,使它们相等,但通常不能假设情况是这样

但是,如果您使用了两次相同的列表,则REMOVE将按预期工作:

(let ((a '(1 2 3))) (remove a (list a '(4 5 6))))
=> ((4 5 6))
上面的示例也可以使用读取器变量编写如下。结果类似,但整个列表在运行时被引用,而不是使用list创建:

在一般情况下,如果不按对象的标识操纵对象,则需要使用知道如何比较列表的测试函数,以便将具有相同内容的不同列表视为相等:

(remove '(1 2 3) '((1 2 3) (4 5 6)) :test #'equal)
=> ((4 5 6))

通过上面的代码,可以将元素与进行比较。

我该如何做:LISP删除成员'MAL'LAENGE-MAL-MASSE-MAL-ZEIT'LAENGE-MAL-MASSE-MAL-ZEIT:test'equal@ChristianMeißner我不明白您想做什么。为什么要调用member?使用member,我可以从列表中删除要删除的元素。因为我想在MAL之前得到元素。看这里这是我的问题:[link]你试图从符号列表中删除一个元素,它是一个列表,LAENGE;因此,remove在您的输入列表中找不到这样的列表。试着设置差异成员'mal'laenge-mal-masse-mal-zeit'laenge-mal-masse-mal-zeit',我怎么做:LISP删除成员'mal'laenge-mal-masse-mal-zeit'laenge-mal-masse-mal-zeit:test'equal@ChristianMeißner我不明白你想做什么。为什么要调用member?使用member,我可以从列表中删除要删除的元素。因为我想在MAL之前得到元素。看这里这是我的问题:[link]你试图从符号列表中删除一个元素,它是一个列表,LAENGE;因此,remove在您的输入列表中找不到这样的列表。尝试设置差异成员“mal”laenge mal masse mal zeit“laenge mal masse mal zeit??