【发布时间】:2018-04-04 23:24:23
【问题描述】:
我试图理解为什么这会产生似乎是循环列表。
* (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的结果。
好的,我找到了答案: 我的困惑源于误解了spec,他们说 append 返回一个新列表。
显然,一个新列表并不意味着它的每个成员都是新的(并不意味着返回一个副本)。 append的最后一个参数其实是共享的……
【问题讨论】:
-
在标记为重复的响应中,
setf函数不会将变量设置为来自append的结果 -
为什么不应该是一个循环列表?拿一张纸,画出 cons 单元格的图形。
-
设置
*print-circle*为T,你会看到循环 -
@coredump 我的问题是,为什么这会创建一个循环,而不是如何打印它。
标签: common-lisp sbcl