
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