如何打印显示共享结构?

How to print showing shared structure?

例如,下面计算的两个表达式具有相同的“打印”表示形式,即 ((A) (A)),但它们具有非常不同的 内部 结构。这里的结构是 shared:

* (let ((item '(a))) (list item item))
((A) (A))

这里每个 (a) 都是一个不同的实体:

* '((a) (a))
((A) (A))

具体来说,第一个表达式的值是一个双元素列表,其中两个元素 相同;第二个表达式的值也是一个双元素列表,但它的两个元素是 distinct(即 not 相同)。

我怎样才能以一种更明显的方式来表示这两个值,使它们的内部结构差异更加明显?

你要找的是*print-circle*:

* (setq *print-circle* t)
T
* '((a) (a))
((A) (A))
* (let ((item '(a))) (list item item))
(#1=(A) #1#)

如果你想要“print - read 一致性”,你应该调查一下 *print-readably*with-standard-io-syntax:

(equal (read-from-string (with-standard-io-syntax (write-to-string x)))
       x)

应该 return T 或发出类型错误信号 print-not-readable.