Common Lisp中具有多级列表的成员函数

ran*_*192 1 function list common-lisp member

我试图通过列表和列表列表了解它是如何工作的成员函数.
这是一个例子.

(member '(A 6) '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'second)   
Run Code Online (Sandbox Code Playgroud)

如果列表'(A 6)的第二个参数是输入中第二个列表的成员,我想检查成员函数.答案应该是

true
Run Code Online (Sandbox Code Playgroud)

但是我做错了,因为Common Lisp回复:

 Error: Cannot coerce (A 6) to type STRING. 
Run Code Online (Sandbox Code Playgroud)

那么如何从第一个列表中取出第二个参数呢?感谢您的帮助.

sds*_*sds 5

你缺少的是:key参数不适用于第一个参数member.

另一件事是second将返回数字,而不是符号.

从而:

(member 'A '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
==> ((A 7) (B 6) (E 6) (D 5))
(member 'C '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
==> NIL
(member 'E '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
==> ((E 6) (D 5))
Run Code Online (Sandbox Code Playgroud)

请注意,返回值是tail,而不是匹配的list元素.这是为了允许使用member作为谓词,即区分发现nil和找不到任何东西:

(member nil '(1 2 nil 3))
==> (NIL 3)
(find nil '(1 2 nil 3))
==> NIL
(find t '(1 2 nil 3))
==> NIL
Run Code Online (Sandbox Code Playgroud)