为什么这样:
(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
适用于所有序列。
答案 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")