Hi Ramana,
I've thought about this and I really don't think it would be a good idea to allow weak references to contain immutable data. It's not just that sometimes entries could be retained unexpectedly it's that they could also be discarded while the data is still reachable. The multi-threaded GC uses weak coherency for immutable data which means that there is a finite possibility of a cell being duplicated. That in turn could mean that the entry in the weak reference would be set to NONE while the data still exists. From the point of view of your users it could mean that your identifiers would change from run to run. I think if you want to use weak references you're going to have to accept the overhead of an extra mutable cell in order to get consistent behaviour.

Regards,
David

On 06/10/2015 23:48, Ramana Kumar wrote:
Hi David,

Thanks very much for the explanation.

My motivation for hash-consing is as follows. I want to add an id (an
integer) that is (at least) unique for every distinct value of certain
types in the HOL4 kernel. (The motivation for these ids is on-the-fly
proof-recording by emitting a trace of kernel operations.) Hash-consing
would allow me to re-use ids for new constructions of values that are equal
to existing values.

From your explanation, I understand that Poly/ML's garbage collector is
already effectively doing hash-consing via its "sharing" phase. However, if
I add ids to my values, they will no longer be equal from the garbage
collector's perspective and I will lose the benefits of sharing. (An
alternative perspective: if I add ids, I will not know when to re-use the
same id because the garbage collector doesn't expose information about
whether a structurally equal (modulo the id) value is reachable already.)

So this leaves me with two avenues to pursue:

    1. Would it be easy to add an alternative interface to the garbage
    collector wherein weak pointers can point to immutable data? (So I could
    use that with my own hash-consing, given that I don't care about being
    precise about discovering whether some object is reachable or not.)
    2. Or, could Poly/ML expose some primitives by which I could add unique
    ids to certain objects (or simply read existing ids if you already have
    them) while benefiting from the garbage collector's own
    hash-consing/sharing implementation?


Thanks,
Ramana

_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to