View · Search · Index
No registered users in community xowiki
in last 10 minutes

Re: [Xotcl] "tie" command

From: Uwe Zdun <uwe.zdun_at_wu-wien.ac.at>
Date: Fri, 24 Jan 2003 15:49:47 +0100

On Friday 24 January 2003 15:09, Kristoffer Lawson wrote:
> On Fri, 24 Jan 2003, Uwe Zdun wrote:
> > nice idea, I've played a bit with var traces to make some tie
> > functionality work; is this what you were thinking of?
>
> Yeah, nice going. Looks like exactly what I had in mind (I reckoned you
> could probably do it with Tcl traces). I thinking that I might almost
> prefer if [tie] was not an object command as it's not really related to
> any specific object (f.ex. using it from outside an object would be
> funny). Or what do you think?

its no big deal to do that: for instance see the code below; the problem with
this code sample is you have to be sure that the variable is defined one
level above the trace; if you are not, you'll have to use global variables
only for ties; or you store all tie variables in a special namespace; such as
the xotcl namespace.


proc tie {varname objname} {
    upvar $varname v
    set v $objname
    trace variable v wu "tie_cb $objname"
}
proc tie_cb {tieobj n1 n2 mode} {
    upvar $n1 name
    ## delete the tieobj
    if {[xotcl::Object isobject $tieobj]} {
        $tieobj destroy
    }
    ## delete the trace for this tieobj
    if {$mode == "w"} {
        foreach t [trace vinfo name] {
            set mode [lindex $t 0]
            set cmd [lindex $t 1]
            if {[string equal $cmd "tie_cb $tieobj"]} {
                #puts "delete: $mode $cmd"
                trace vdelete name $mode $cmd
                #puts [trace vinfo name]
            }
        }
    }
}

####################################################### Test

set n 0
while {$n < 10} {
  tie myVar [Object new]
  incr n
}

### only one should have survived
puts [Object info instances]

### test unset
unset myVar

puts [Object info instances]


-- 
Uwe Zdun
Department of Information Systems, Vienna University of Economics
Phone: +43 1 313 36 4796, Fax: +43 1 313 36 746
zdun_at_{xotcl,computer,acm}.org, uwe.zdun_at_wu-wien.ac.at