Lisp 成员函数在cons结构中不起作用
我写了两个程序,一个是takeoutAllButLast,另一个是takeoutSecondLast 我最初使用member函数来确定后面是否有更多的X 我尝试了一些数据,发现: 如果第一个参数是一个符号,它们都可以工作 但如果这是一个缺点,它们都会失败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)
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):测试#'相等)