Common Lisp中的等于运算符

fvr*_*ghl 4 lisp equality common-lisp

为什么这样:

(every (lambda (x) (equal "a" x)) "aaaaa")
Run Code Online (Sandbox Code Playgroud)

还有这个:

(every (lambda (x) (equal "a" x)) "a")
Run Code Online (Sandbox Code Playgroud)

回来NIL,而这个:

(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a"))
Run Code Online (Sandbox Code Playgroud)

回来了T?我认为every在所有序列上工作.

Rai*_*wig 15

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

CL-USER 1 > (every (lambda (x) (equal "a" x)) "a")
NIL
Run Code Online (Sandbox Code Playgroud)

以上返回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
Run Code Online (Sandbox Code Playgroud)

所以价值x就是一个人物.这个角色#\a.

"a" is a SIMPLE-BASE-STRING
0      #\a
NIL
Run Code Online (Sandbox Code Playgroud)

"a"的类型是SIMPLE-BASE-STRING(这里是LispWorks).

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

CL-USER 3 > (equal #\a "a")
NIL
Run Code Online (Sandbox Code Playgroud)


mon*_*oid 13

由于在例1和例2你比较"a"#\a,但在后一种情况下你比较"a""a".字符串的元素是字符,而不是其他字符串.

例如:

(every (lambda (x) (equal #\a x)) "aaaaa")
=> T
Run Code Online (Sandbox Code Playgroud)

另一种选择是强制x字符串:

(every (lambda (x) (equal "a" (string x))) "aaaaa")
Run Code Online (Sandbox Code Playgroud)