gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:05:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com