Common Lisp:为什么这会创建循环列表:(setf(car)(append))?

时间:2018-04-04 23:24:24

标签: common-lisp sbcl

我试图理解为什么这会产生似乎是循环列表的内容。

 * (progn
 (setf (car *x*) (append '(3) *x*))
 2)

2  ;; No "apparent issue setting the value. Hence it is related to printing `*x*`
*x* ;; infinite loop, perhaps due to the structure of *x*??

为什么这是循环清单?我希望它不应该是循环列表

此问题与“重复”问题有何不同之处:

在这个问题中,我认为*x*不应该是循环列表。在重复的答案链中,显示了如何创建循环列表,并且示例都未使用appendsetf的结果。

好吧,我找到了答案: 我的困惑源于对spec的误解,他们说追加会返回一个新列表。

显然,新列表并不意味着它的每个成员都是新的(并不意味着返回一个副本)。追加的最后一个参数实际上是共享的......

1 个答案:

答案 0 :(得分:2)

这不是读者,而是处于无限循环中的打印机 大多数实现都有一个变量来限制顶级打印机, 见*PRINT-LEVEL*, *PRINT-LENGTH*