Posted to tcl by evilotto at Fri Aug 24 22:51:07 GMT 2018view pretty

namespace eval ::ref {
    variable refs {}
    variable cnt 0
}

proc ref {value} {
    set rv ::ref::<refs_[incr ::ref::cnt]>
    dict set ::ref::refs $rv $value
    return $rv
}

proc getref {rv} {
    dict get $::ref::refs $rv
}

proc setref {rv value} {
    dict set ::ref::refs $rv $value
}

proc collect {} {
    set arefs $::ref::refs
    foreach v [info globals] {
        if [array exists ::$v] continue
        set val [set ::$v]
        if {[dict exists $arefs $val]} {
            dict unset arefs $val
        }
    }
    set count 0
    foreach k [dict keys $arefs] {
        puts "no reference to $k"
        dict unset ::ref::refs $k
        incr count
    }
    puts "collected $count"
}