为什么会这样:
(every (lambda (x) (equal "a" x)) "aaaaa")
和这个:
(every (lambda (x) (equal "a" x)) "a")
return NIL
,而这个:
(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a"))
回报T
?我认为every
适用于所有序列。
为什么会这样:
(every (lambda (x) (equal "a" x)) "aaaaa")
和这个:
(every (lambda (x) (equal "a" x)) "a")
return NIL
,而这个:
(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a"))
回报T
?我认为every
适用于所有序列。
你总能自己找出来。如果您使用交互式 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 和案例 2 中比较"a"
and #\a
,但在最后一种情况下比较"a"
and "a"
。字符串的元素是字符,而不是其他字符串。
例如:
(every (lambda (x) (equal #\a x)) "aaaaa")
=> T
另一种选择是强制x
字符串:
(every (lambda (x) (equal "a" (string x))) "aaaaa")