【发布时间】:2017-07-02 01:24:24
【问题描述】:
在Paul Graham's book ANSI Common Lisp,在讨论符号与字符串操作时,他说
符号可以一步与
eql比较..."
(p138)。下面是符号比较的两种情况:
(setq x 3)
3
(setq a 'x)
X
(setq b 'x)
X
(eq a b)
T
所以,由于a 和b 指向同一个符号对象,名为"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
现在,a 和 b 指向不同的 symbol 对象,即使它们具有相同的 symbol-name 和相同的打印名称。我的问题是:
- 为什么格雷厄姆说
eql而不是eq,以及 - 在第二种情况下,为什么
a和b至少不是equalp?
【问题讨论】:
-
EQ 或 EQL 在比较符号时没有区别。 copy-symbol 返回一个新的、非驻留的符号。因此,由 copy-symbol 创建的符号不等于任何东西。它们总是不同的。
-
@Rainer Joswig 感谢您提醒我注意
copy-symbol不实习符号这一事实。那么如何使用(copy-symbol 'x t)将X 的所有符号特征(symbol-name除外)复制到另一个实习符号Y?还是您必须先创建一个实习符号,然后分别setf每个功能? -
How then does one use (copy-symbol 'x t) to copy to copy all the symbol features of X (except symbol-name) to another interned symbol?-> 您可以将新的和复制的符号实习到其他包中。
标签: common-lisp symbols