目前我正在阅读“Lisp 之国”。在作者最近给出的一个代码示例中:
> (eq 'fooo 'FoOo)
T
证明符号不区分大小写。几页之后,数据模式被正式引入。
但是我未能真正理解以下内容。 eq
是一个函数,所以它的名字也是不区分大小写的。因此我应该能够做到这一点:
> (eq 'Eq 'EQ)
T
太棒了。这按预期工作。但是,如果我将其放入数据模式的列表中怎么办?请记住,我只是在试验对我来说是新的东西。
> (eq '(Eq) '(EQ))
NIL
> (eq '('Eq) '('EQ))
NIL
嗯。好的?这是为什么?我本以为如果我将相同的符号放入两个列表中,那么这两个列表将被视为相等。
现在的问题是:这是否意味着比较的不是列表的内容,而是列表“对象”本身?我错过了什么?
最佳答案
符号区分大小写
> (eq (print (intern "foo")) (print (intern "FOO")))
|foo| ; printed
FOO ; printed
==> NIL ; returned
默认阅读器是大小写转换
(eq (read-from-string "foo") (read-from-string "FOO"))
==> T
但是,您可以让阅读器保留大小写:
(let ((*readtable* (copy-readtable)))
(setf (readtable-case *readtable*) :preserve)
(eq (read-from-string "foo") (read-from-string "FOO")))
==> NIL
请看
EQ 比较指针身份
Common Lisp provides 4 equality predicates ,您应该根据自己的需要使用正确的:
(equal '(Eq) '(EQ))
==> T
(equal '('Eq) '('EQ))
==> T
关于common-lisp - 理解 Lisp 中的数据模式,为什么这些表达式不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313040/