Page 1 of 1

how to avoid this stackoverflow?

Posted: Sun May 27, 2012 11:20 am
by The_Ash
Hi!
consider:

Code: Select all

(defstruct A
    left
    right)

(setf i (make-a)
        j (make-a :left i))
at this point

Code: Select all

>j
#S(A :LEFT #S(A :LEFT NIL :RIGHT NIL) :RIGHT NIL)
now obviously adding

Code: Select all

(setf (a-right i) j)
will result in a stack overflow,since

Code: Select all

>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?

Posted: Sun May 27, 2012 1:47 pm
by wvxvw
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?

Posted: Sun May 27, 2012 2:50 pm
by The_Ash
Thanks a lot for your help wvxvw!