haskell reify, was sequencing data structures
Alastair Reid
alastair@reid-consulting-uk.ltd.uk
Thu, 21 Aug 2003 11:49:56 +0100
> Things that seem important (to me) are:
>
> - Do you want to observe cycles and or sharing?
Yes.
> Of course this is very hard to do because of garbage collection.
Only in the sense that holding onto an object pointer to detect a cycle might
cause you to hold onto the object too - causing a space leak. Weak pointers
probably play a useful role in solving this but I didn't explore this.
> In buddha I observe cycles
> but not other forms of sharing. To do this I have to be very careful
> not to cause garbage collection when I'm traversing the heap.
> I don't remember now whether you can observe cycles using the
> Hugs internals interface. I _think_ that it was possible but I don't
> remember.
Yes, Hugs lets you see sharing.. The CVHAssert module makes use of cycle and
sharing detection in calculating the heap space consumed by an object.
The Hugs interface has:
- raw objects of type 'alpha' (i.e., the Haskell type of the object)
- object pointers of type 'Cell' (would be better called 'Thunk'?) which
provide a layer of indirection to the object. This indirection lets you prod
a thunk pointer ni various ways without evaluating the object it points to.
These pointers support pointer equality tests with short-circuiting of
indirection nodes.
- Cell classifications - whether it is an Int, Float, application, thunk, etc.
> - Do you want the ability to force thunks or just stop when you see
> them? The incremental approach of the Hugs interface is nice, but I'm
> worried that it will make the detection of cycles harder - that's the
> reason I moved to reify in buddha away from Hugs style. (In buddha I just
> want to print things up to the extent that they are evaluated when reify is
> called, I stop when I see a thunk, cycle, nullary constructor).
Detecting cycles is easy in the Hugs interface.
You can continue observing below an unevaluated thunk if you wish - just print
the name of the supercombinator and keep going (or disassemble the
supercombinator if you wish). Or you can force an unevaluated thunk if that
takes your fancy.
--
Alastair