【问题标题】:Common Lisp: Why does this create circular list: (setf (car ) (append ))? [duplicate]Common Lisp:为什么这会创建循环列表:(setf(car)(append))? [复制]
【发布时间】: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


【解决方案1】:

陷入无限循环的不是阅读器,而是打印机。
大多数实现都有一个变量来限制顶级打印机, 见*PRINT-LEVEL*, *PRINT-LENGTH*

【讨论】:

  • 感谢指正。我将编辑问题
猜你喜欢
  • 2021-08-05
  • 2013-05-16
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2013-02-12
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多