This is a read-only archive of lispforum.com. The forum was locked to new users and posts and is preserved here as static HTML from a database snapshot taken on 2019-09-07.

how to avoid this stackoverflow?

3 posts · 2146 views

Hi!
consider:
(defstruct A
    left
    right)

(setf i (make-a)
        j (make-a :left i))
at this point
>j
#S(A :LEFT #S(A :LEFT NIL :RIGHT NIL) :RIGHT NIL)
now obviously adding
(setf (a-right i) j)
will result in a stack overflow,since
>j
#S(A :LEFT #S(A :LEFT NIL :RIGHT #S(A :LEFT #S(A :LEFT NIL :RIGHT ..... and so on forever
now is there a way to avoid that?
if that helps:i encountered that problem as i was trying to make a BST.i wanted each node of the tree to have 3 fields,one to point to its parent,
two to point to its children...
thanks a lot for your help!

Re: how to avoid this stackoverflow?

The stack overflow is caused by the REPL trying to print the object (but it's fine to have it like you designed it, it doesn't cause stack overflow on its own). You will need to define method print-object to prevent recursive printing of A. While defining it, you will need to take care of *print-circle* - it must be set to T as shown here: http://clhs.lisp.se/Body/v_pr_cir.htm#STprint-circleST so that objects aren't printed repeatedly.

Re: how to avoid this stackoverflow?

Thanks a lot for your help wvxvw!