[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Hash Tables and GC



    I just got back from vacation and read the discussion of has tables.
    One point seems not to have been discussed - "Weak" links in hash
    tables would be almost impossible to implement except for EQ hash
    tables.  Not only does the GC have to prove that the reference
    count for both key and value is one, but the GC also has to prove
    that there are no other objects, x, such that:
    	(<Equality-Predicate> x KEY)
    For EQ hash tables this condition is true, a priori, but for any
    other hash table it is not.  Consider an EQL hash table with
    BIGNUM keys.  A program could somehow effectively copy a bignum
    that is being used as a hash table key and then lose the original.
    
    For EQUAL hash tables it is even worse.  Suppose (A . B) is a
    key.  At any time a program might apply CONS to A and B to
    re-create the key.  For example, suppose I am using a hash
    table to represent a graph.  If A and B are nodes, then
    the graph-links can be implemented using a hash table like this:
    
    (defun BEFORE-P (A B)
    	(gethash (cons a b) *link-table*))
    
    Even EQ hash tables have problems, in any implementation with
    immediate representations for objects.  For example the key 57236
    (a fixnum) may not be interned and therefor there is no way to tell
    how many copies of it exist.
    
    Because of these problems I would suggest that this feature be
    restricted to EQ and EQL hash tables, and that numbers of all types
    should be considered accessible keys.