4

为什么会这样:

(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适用于所有序列。

4

2 回答 2

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
于 2013-07-03T08:52:26.303 回答
13

因为在案例 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")
于 2013-07-03T03:07:36.847 回答