Here is my new candidate for an intern(string) function in Nim:
    
    
    import lists
    
    
    var lst = initSinglyLinkedRing[string]()
    var tbl = initTable[string,  ref SinglyLinkedNodeObj[string]]()
    
    proc intern(s: string): ref SinglyLinkedNodeObj[string] =
        if s in tbl:
            return tbl[s]
        else:
            lst.append(s)
            tbl[s] = lst.tail
            return tbl[s]
    
    var a = "hello"
    var b = "hello"
    
    a = intern(a).value
    b = intern(b).value
    
    
    echo "a = ", a
    echo "b = ", b
    
    assert (a == b)
    assert (intern(a) == intern(b))
    
    echo "len(T) = ", len(tbl) ## len(T) -> 1, not 2, as expected.
    
    
    Run

Reply via email to