Dear GAP-Forum,
Andreas Prinz wrote
I ran across a segmentation error with the following
computation:gap> el:=List([1..4],x->rec(num:=x));; gap> bl:=List([1..2],x->rec(num:=x,els:=Filtered(el,e->(e.num+x) mod 2=0)));; gap> for b in bl do for e in b.els do e.block:=b; od; od; gap> Set(bl); Segmentation fault (core dumped)I guess, it is due to the recursive nature of the structs, but
I need it to be such. Probably I can do with defining a "<"
relation for the records, but there seems to be a bug in gap
anyway.
Indeed the problem occurs because the objects contain themselves as
proper substructures.
Here is how 'bl[1]' looks like before the call of 'Set'.
gap> bl[1]; rec( num := 1, els := [ rec( num := 1, block := ~ ), rec( num := 3, block := ~ ) ] )
As the GAP manual says in the section "Comparison of Records",
the comparison of records is implemented by comparing the components.
This runs into an infinite recursion in this case.
So I would not regard the behaviour as a bug.
(A simpler example is the comparison of two lists that contain themselves.
gap> l:= [];; l[1]:= l;; l; [ ~ ] gap> l = Copy( l ); <segmentation fault>
This runs into an infinite recursion for the same reason.)
If one knows about the internal structure of objects as in the list 'bl',
implementing a special method for '<' that looks at the non-recursive
components first will solve the problem; the details are described in the
manual section cited above.
Kind regards
Thomas