Common Lisp中的等于运算符

4
为什么会出现这个问题:

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


1
(这是一个函数,而不是运算符,请注意) - d11wtq
@d11wtq 你能解释一下吗? - fvrghl
1
Lisp没有'运算符',它只有函数。当你执行(equal x y)时,你正在将equal函数应用于xy - d11wtq
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

13
因为在情况1和情况2中,您比较的是"a"#\a,但在最后一种情况中,您比较的是"a""a"。字符串的元素是字符,而不是其他字符串。
例如:
(every (lambda (x) (equal #\a x)) "aaaaa")
=> T

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接