我正在 Common Lisp (sbcl) 中为双向链表编写一个插入函数,并将两个节点设置为彼此指向,导致结果在无限循环中打印。为什么?是什么原因导致节点无限打印呢?如何防止对象以这种方式打印?
这是一个最小的示例(全局变量用于使事情变得简单)。
(defstruct node
data
next
prev)
(defparameter *new* (make-node :data "hello"))
(defparameter *original* (make-node :data "world"))
(setf (node-prev *original*) *new*) ;; Prints fine.
(setf (node-next *new*) *original*) ;; INFINITE LOOP WHEN PRINTING!!!
这不是很明显吗?“设置两个节点相互指向”->它是圆形的。打印机打印一个节点,打印前一个节点,打印下一个节点,打印前一个节点,打印下一个节点,打印前一个节点,...
可以指示打印机检测周期。使用
cl:*print-circle*
设置为 T: