Common Lisp中的等于运算符

时间:2013-07-03 02:53:00

标签: lisp common-lisp equality

为什么这样:

(every (lambda (x) (equal "a" x)) "aaaaa")

和此:

(every (lambda (x) (equal "a" x)) "a")

返回NIL,同时:

(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a"))

返回T?我认为every适用于所有序列。

2 个答案:

答案 0 :(得分:15)

你总是可以自己找到它。如果您使用交互式Lisp系统,测试只需几秒钟:

CL-USER 1 > (every (lambda (x) (equal "a" x)) "a")
NIL

以上返回NIL。

现在使用Common Lisp函数DESCRIBE来获取所描述的数据。

CL-USER 2 > (every (lambda (x)
                     (describe x)
                     (describe "a")
                     (equal "a" x))
                   "a")

#\a is a CHARACTER
Name                "Latin-Small-Letter-A"
Code                97
Bits                0
Font                0
Function-Key-P      NIL

因此x的值是一个字符。角色#\a

"a" is a SIMPLE-BASE-STRING
0      #\a
NIL

“a”的类型是SIMPLE-BASE-STRING(在LispWorks中)。

如果你看一下EQUAL的定义,那么你可以看到一个字符和一个字符串永远不会相等,因为它们的类型不同。

CL-USER 3 > (equal #\a "a")
NIL

答案 1 :(得分:13)

因为在案例1和案例2中,您比较"a"#\a,但在最后一种情况下,您要比较"a""a"。字符串的元素是字符,而不是其他字符串。

例如:

(every (lambda (x) (equal #\a x)) "aaaaa")
=> T

另一种选择是将x强制转换为字符串:

(every (lambda (x) (equal "a" (string x))) "aaaaa")