Estou escrevendo uma função de inserção para uma lista duplamente vinculada em Common Lisp (sbcl) e definir dois nós para apontarem um para o outro faz com que o resultado seja impresso em um loop infinito. Por que? O que faz com que o nó seja impresso infinitamente? Como posso evitar que um objeto seja impresso dessa maneira?
Aqui está um exemplo mínimo (vars globais usados para manter as coisas simples).
(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!!!
Não é óbvio? "definir dois nós para apontar um para o outro" -> é circular. A impressora imprime um nó, que imprime o nó anterior, que imprime o próximo nó, que imprime o nó anterior, que imprime o próximo nó, que imprime o nó anterior, ...
A impressora pode ser instruída para detectar ciclos. Use
cl:*print-circle*
definido como T: