gpt4 book ai didi

common-lisp - 符号相等

转载 作者:行者123 更新时间:2023-12-04 00:36:08 25 4
gpt4 key购买 nike

Paul Graham's book ANSI Common Lisp ,在讨论符号与字符串操作时,他说

Symbols can be compared in one step with eql ..."

(第 138 页)。下面是符号比较的两种情况:

(setq x 3)
3
(setq a 'x)
X
(setq b 'x)
X
(eq a b)
T

因此,由于 ab 指向同一个符号对象,名为 "X",它们是 eq。然而,这与

(setq a (copy-symbol 'x))
#:X
(setq b (copy-symbol 'x))
#:X
(symbol-name a)
"X"
(symbol-name b)
"X"
(eq a b)
NIL
(eql a b)
NIL
(equal a b)
NIL
(equalp a b)
NIL

现在,ab 指向不同的 symbol 对象,即使它们具有相同的 symbol-name 和相同的打印名称。我的问题是:

  1. 为什么格雷厄姆说eql而不是eq,并且
  2. 在第二种情况下,为什么 ab 不至少 equalp

最佳答案

eqleq

eql在较少依赖于实现的意义上是“更可预测的”。例如,非立即数(即非 fixnum s) 可以是非 eq在某些实现中和 eq在其他方面:

(= 1.5d0 1.5d0)
=> T
(eql 1.5d0 1.5d0)
=> T
(eq 1.5d0 1.5d0)
=> T in some implementations, NIL in others

为什么同名符号不是equalp

这就是规范所说的:-)

请注意,它确实违反了经验法则:

A rough rule of thumb is that two objects are equal if and only if their printed representations are the same.

主非histerical reason因为这就是那个符号,同时“原子”,仍然带有很多包袱(例如,变量和函数绑定(bind))。 IOW,一个symbol是远不止它的名字。

另外,人们普遍认为 equal表格评估为 equal值,如果不同的符号(与可能不同的绑定(bind)!)被评估为 equal .

现在,equal 之间的唯一区别是和 equalp

  1. 不区分大小写的字符(和字符串)比较
  2. 使用 = 比较数字
  3. 递归下降到 structure , array , 和 hash-table .

这些变化都不会影响上面的“相似评价规则”,所以没有理由 equalp比较符号基于他们的名字。

如果你想通过名称比较符号,你可以使用 string= :

(eq '#:a '#:a)
==> NIL
(equalp '#:a '#:a)
==> NIL
(string= '#:a '#:a)
==> T

关于common-lisp - 符号相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214560/

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