【问题标题】:Member function not work in cons structure成员函数在 cons 结构中不起作用
【发布时间】:2012-10-11 13:54:45
【问题描述】:

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

我最初使用成员函数来判断后面是否还有X。

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

如果第一个参数是符号,它们都有效!

但如果是 cons 结构,它们都失败了。

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结构?

感谢您阅读我的问题!

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    member 默认使用eql 作为其相等谓词。这适用于符号、数字和其他一些东西(即(eq 'a 'a) 始终为真,(let ((cons (cons 'a 'a))) (eql cons cons)) 始终为真,但(eql (cons 'a 'a) (cons 'a 'a)) 几乎从不为真)。

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

    如果您想使用自定义相等检查器 foo 调用 member,只需执行以下操作:

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

    【讨论】:

    • 你能举个例子把相等检查器传递给成员吗?谢谢。
    • 尝试(成员 X(其余 L):test #'equal)
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多