Common Lisp中具有多级列表的成员函数
Member function with multi-level list in Common Lisp
我正在尝试了解成员函数如何与列表和列表列表一起工作。
这是一个例子。
(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.
那么如何从第一个列表中获取第二个参数呢?
谢谢你的帮助。
您缺少的是 :key
参数 而不是 应用于 member
的第一个参数。
另一件事是 second
将 return 数字 ,而不是 符号 。
因此:
(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))
请注意,return 值是 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
我正在尝试了解成员函数如何与列表和列表列表一起工作。
这是一个例子。
(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.
那么如何从第一个列表中获取第二个参数呢? 谢谢你的帮助。
您缺少的是 :key
参数 而不是 应用于 member
的第一个参数。
另一件事是 second
将 return 数字 ,而不是 符号 。
因此:
(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))
请注意,return 值是 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