Lisp 成员函数在cons结构中不起作用

Lisp 成员函数在cons结构中不起作用,lisp,common-lisp,Lisp,Common Lisp,我写了两个程序,一个是takeoutAllButLast,另一个是takeoutSecondLast 我最初使用member函数来确定后面是否有更多的X 我尝试了一些数据,发现: 如果第一个参数是一个符号,它们都可以工作 但如果这是一个缺点,它们都会失败 1.// `(a b) `((b b)(a b)(b c)(a b)) ==> `((b b)(b c)(a b)) (defun takeoutAllButLast (X L) (cond ((null L) nil)

我写了两个程序,一个是takeoutAllButLast,另一个是takeoutSecondLast

我最初使用member函数来确定后面是否有更多的X

我尝试了一些数据,发现:

如果第一个参数是一个符号,它们都可以工作

但如果这是一个缺点,它们都会失败

1.// `(a b)   `((b b)(a b)(b c)(a b)) ==>  `((b b)(b c)(a b)) 

(defun takeoutAllButLast (X L)
(cond ((null L) nil)
       ((equal X (first L)) 
           (if (member X (rest L)) 
               (takeoutAllButLast X (rest L)) 
               L)) 
       (t (cons (first L) (takeoutAllButLast X (rest L))))
)
)

2.//`(a b)   `((a b)(b b)(a b)(b c)(a b)) ==>  `((a b)(b b)(b c)(a b)) 
(defun takeoutSecondLast (X L)
(cond ((null L) nil)
       ((equal X (first L)) 
           (if (member X (rest (member X (rest L))))
    (cons (first L) (takeoutSecondLast X (rest L)))
    (rest L)
           )
    )
   (t (cons (first L) (takeoutSecondLast X (rest L))))
 )
我想问的是,如何确定是否还有一个元素后面有X,并且可以像成员函数一样使用

为什么不能使用成员函数来比较cons结构


谢谢你阅读我的问题

member
默认使用
eql
作为其相等谓词。这在符号、数字和其他一些事情上很好(即
(eq'a'a)
总是正确的,
(let((cons(cons'a'a)))(eql-cons))
总是正确的,但是
(eql(cons'a'a)(cons'a'a))
几乎从来都不是正确的)

您可以使用
:test
关键字将替代相等检查器传递给
成员
,如果您使用
#'equal
,您将(可能)得到您想要的

如果要使用自定义等式检查器调用
成员
,只需执行以下操作:

(member thing-to-check-for the-list-to-check :test #'foo)

你能举一个例子给会员传递一个平等检查器吗?谢谢。试试(X成员(其余L):测试#'相等)