Common lisp CommonLisp:为什么要创建循环列表:(setf(car)(append))?

Common lisp CommonLisp:为什么要创建循环列表:(setf(car)(append))?,common-lisp,sbcl,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*?? 为什么是循环列表?我希望它不应该是一份循环清单 这个问题与“重复”问题有什

我试图理解为什么这会产生一个循环列表

 * (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*
不应该是一个循环列表。在重复答案链中,演示了如何创建循环列表,并且两个示例均未使用
setf
中的
append
结果

好吧,我找到了答案: 我的困惑源于误解,他们说append返回一个新列表


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

处于无限循环中的不是读卡器,而是打印机。
大多数实现都有一个变量来限制顶级打印机,
请参见

处于无限循环中的不是阅读器,而是打印机。
大多数实现都有一个变量来限制顶级打印机,
请参见

谢谢您的更正。我将编辑问题谢谢你的更正。我将编辑标记为重复响应的问题,
setf
函数不会将变量设置为来自
append
的结果,为什么不应该是循环列表?拿一张纸画cons单元格的图形。将
*print circle*
设置为T,您将看到cycle@coredump我的问题是,为什么这会创建一个循环,而不是如何打印它。在标记为重复的响应中,
setf
函数没有将变量设置为来自
append
的结果,为什么它不应该是循环列表?拿一张纸画cons单元格的图形。将
*print circle*
设置为T,您将看到cycle@coredump我的问题是,为什么这会创建一个循环,而不是如何打印它。