关于eq的Scheme和R5RS问题

Scheme and R5RS questions about eq

你能解释一下为什么第一个是假的而第二个是真的吗?

这是如何运作的?谢谢

(eq? '(1 2 3) '(1 2 3)) ;False
(eq? '() '()) ;True

只有一个空列表,所以 () 的所有使用都指的是该列表,eq? 指的是它本身。 Scheme Specification 存储模型的描述说:

Notwithstanding this, it is understood that the empty list cannot be newly allocated, because it is a unique object.

eqv? 的规范(由 eq? 描述引用)说如果

两个对象是等价的

obj1 and obj2 are both the empty list

但是,当您创建一个非空列表时,它每次都会创建一个新列表,并且即使它们包含相同的元素,它们也不会 eq? 彼此。

引自TSPL3:

[..] Two objects are considered identical if they are represented internally by the same pointer value [..] The empty list () is identical to itself wherever it appears. [..] Two pairs, vectors, or strings created by different applications of cons, vector, string, etc., are distinct.

如果你改写

(let ((x '(1 2 3)))
  (eq? x x))

它将是#t