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)