rho*_*ron 1 lisp clisp common-lisp
我遇到了一个非常奇怪的问题.我有一个名为"定理"的列表,它只有一个项目.这是证据:
[]> theorems
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
[]> (car theorems)
((ROSES ARE RED) ^ (~ (ROSES ARE RED)))
Run Code Online (Sandbox Code Playgroud)
显然((ROSES为RED)^(〜(ROSES ARE RED)))是列表"定理"的成员.但是,当我测试它的成员资格时,它失败了:
[]> (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED))) theorems)
NIL
Run Code Online (Sandbox Code Playgroud)
但是,如果我明确地称它,它的工作原理:
[]> (member (car theorems) theorems)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决?
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
Run Code Online (Sandbox Code Playgroud)
告诉MEMBER使用EQUAL:
CL-USER 13 > (member '((ROSES ARE RED) ^ (~ (ROSES ARE RED)))
theorems
:test 'equal)
(((ROSES ARE RED) ^ (~ (ROSES ARE RED))))
Run Code Online (Sandbox Code Playgroud)