当 要返回“真”时,与其仅仅返回 t ,它返回由寻找对象所开始的那部分。逻辑上来说,一个 Cons 扮演的角色和 t 一样,而经由这么做,函数返回了更多资讯。

    一般情况下, member 使用 eql 来比较对象。你可以使用一种叫做关键字参数的东西来重写缺省的比较方法。多数的 Common Lisp 函数接受一个或多个关键字参数。这些关键字参数不同的地方是,他们不是把对应的参数放在特定的位置作匹配,而是在函数调用中用特殊标签,称为关键字,来作匹配。一个关键字是一个前面有冒号的符号。

    一个 member 函数所接受的关键字参数是 :test 参数。

    如果你在调用 member 时,传入某个函数作为 :test 参数,那么那个函数就会被用来比较是否相等,而不是用 eql 。所以如果我们想找到一个给定的对象与列表中的成员是否相等( equal ),我们可以:

    1. > (member '(a) '((a) (z)) :test #'equal)
    2. ((A) (Z))

    另一个 member 接受的关键字参数是 :key 参数。借由提供这个参数,你可以在作比较之前,指定一个函数运用在每一个元素:

    在这个例子里,我们询问是否有一个元素的 是 a

    如果我们想要使用两个关键字参数,我们可以使用其中一个顺序。下面这两个调用是等价的:

    1. > (member 2 '((1) (2)) :key #'car :test #'equal)
    2. ((2))
    3. > (member 2 '((1) (2)) :test #'equal :key #'car)

    两者都询问是否有一个元素的 car 等于( equal ) 2。

    我们可以想像一个限制性的版本 member-if 是这样写成的:

    1. (defun our-member-if (fn lst)
    2. (and (consp lst)
    3. (if (funcall fn (car lst))
    4. lst

    函数 adjoin 像是条件式的 cons 。它接受一个对象及一个列表,如果对象还不是列表的成员,才构造对象至列表上。

    通常的情况下它接受与 member 函数同样的关键字参数。

    集合论中的并集 (union)、交集 (intersection)以及补集 (complement)的实现,是由函数 unionintersection 以及 set-difference

    1. (A C B S)
    2. > (intersection '(a b c) '(b b c))
    3. (B C)
    4. > (set-difference '(a b c d e) '(b e))
    5. (A C D)

    因为集合中没有顺序的概念,这些函数不需要保留原本元素在列表被找到的顺序。举例来说,调用 set-difference 也有可能返回 。