common-lisp - 理解 Lisp 中的数据模式,为什么这些表达式不一样?

标签 common-lisp equality land-of-lisp

目前我正在阅读“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/

相关文章:

generics - 如何为嵌套在泛型结构中的类实现运算符?

rust - 如何将向量与自身的反向版本进行比较?

c++ - 检查引用是否指向 C++ 中的特定对象

lisp - 在 LISP 中使用 'ash' 执行二进制搜索?

emacs - 调整文本 : Lisp nesting exceeds `max-lisp-eval-depth

list - 如何检查列表中的所有数字是否都在稳步增加?

compilation - Common Lisp 编译和执行时间

clojure - Common Lisp 中的原子和 Clojure 中的原子有什么区别?

string - LISP - 修改字符串

lisp - Lisp 示例冗余之地?