我遇到了一个非常奇怪的问题。我有一个名为“定理”的列表,它只有一个项目。这是证据:
[]> theorems
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
[]> (car theorems)
((ROSES ARE RED) ^ (~ (ROSES ARE RED)))
显然((玫瑰红色)^(〜(玫瑰红)))是列表“定理”的成员。但是当我测试它的成员身份时,它失败了:
[]> (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED))) theorems)
NIL
但是,如果我明确地称之为它,那就有效:
[]> (member (car theorems) theorems)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:6)
Common Lisp使用EQL
作为默认测试函数。 EQL
检查项目是否是相同的相同项目。您想测试项目是否具有相同的结构。因此,您需要使用EQUAL
或EQUALP
。
CL-USER 11 > (setf theorems '(((ROSES ARE RED) ^ (~ (ROSES ARE RED)))))
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
CL-USER 12 > (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED))) theorems)
NIL
告诉MEMBER
使用EQUAL
:
CL-USER 13 > (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED)))
theorems
:test 'equal)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))