Fredderic suggested in c.l.t [L1 ] that absolute references to proc-local variables might be useful. It is of course necessary for such references to cease to be valid when the proc returns.
I propose here a small implementation of such things (NOT TESTED!):
This is quite simplistic, a proper implementation needs some more care. For instance, references to namespace variables do not need this machinery and a FQ name is what should be returned.
namespace eval REF {
variable count 0
proc {} varName {
# Create a namespace variable to store the local's data, intitialize it
# with localvar's value and create a simple alias for it in the context
# of the current proc
upvar 1 $varName localVar
if {[array exists localVar]} {
# this does not (yet?) work for arrays: need more work in the
# transfer of values and traces
return -code error "REF: references to array \"$varName\" not yet implemented"
}
variable count
set refName ::REF::ref_[incr count]
upvar 0 $refName ref
set ref $localVar
# Transfer any traces from localVar to ref
foreach t [trace info variable localVar] {
trace add variable ref {*}$t
trace remove variable localVar $t
}
# Now unset localVar and link it in the caller to the newly created
# reference
unset localVar
uplevel 1 [list upvar #0 $refName $varName]
# Insure that the reference is cleaned up when the caller exits
upvar 1 REFERENCES allRefs
trace add variable allRefs unset "unset -nocomplain ::REF::$refName ;#"
return $refName
}