我试图通过列表和列表列表了解它的成员函数是如何工作的 这是一个例子。
(member '(A 6) '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'second)
如果列表'(A 6)的第二个参数是输入中第二个列表的成员,我想检查成员函数。 答案应该是
true
但我做错了,因为Common Lisp回复:
Error: Cannot coerce (A 6) to type STRING.
那么如何从第一个列表中取出第二个参数呢? 谢谢你的帮助。
答案 0 :(得分: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))
请注意,返回值是 tail ,而不是匹配的列表元素。
这是为了允许使用member
作为谓词,即区分查找nil
和找不到任何内容:
(member nil '(1 2 nil 3))
==> (NIL 3)
(find nil '(1 2 nil 3))
==> NIL
(find t '(1 2 nil 3))
==> NIL