[Xotcl] Changing a parameter's -setter function

Gustaf Neumann neumann at wu-wien.ac.at
Wed Mar 15 10:46:58 CET 2006


Scott Gargash schrieb:
>
> Hello,
>
> Is it possible to change the -setter command associated with a 
> parameter at some point other than class definition?
>
one can use the method "parameter" at any time to add/redefine 
parameters (see below).
>
> I want to trigger some side effects from a parameter set operation, 
> but I can't trigger the side effects until after other things have 
> been initialized, so I want to use the default setter method until the 
> end of init, and then replace the setter method (but not the getter 
> method).
>
technically speaking, if one would like to use a single name for a 
setter and getter (such as
set r [a1 foo]; a1 foo 123) there has to be a single method named "foo", 
handling both cases.
this is not more than a conveniance, one can define an kind of methods 
that behave as accessor
functions.
>
>
> I can override create a parameter-named method at init time, but that 
> overrides the getter along with the setter. I'd rather not have to 
> handle the -getter from my proc (the default -getter is fine and 2.5x 
> faster). I've looked through the docs and the tutorial and I can get 
> tantalizingly close (parametercmd), but is there an easy way from 
> within a proc to change the -setter properties of a parameter?
>
the difference in speed is due to the fact that the default 
setter/getter method is implemented in C,
whereas the tailored functions are in tcl. it is certainly possible to 
program a tailored getter method
in C as well, but i doubt that this is worth the effort.

see below for more variations about your example. Aside from these options,
you can use variable traces to trigger side effects from set/get/unset 
operatons.

-gustaf neumann

########################################

Class create A -parameter {{foo 1}}
A instproc foosetter {var val} {
  # Do something with [self] that isn't valid pre-init
  puts [self proc]
  my set $var $val
}

A create a1 -foo 234 ;# calls default foo setter
# redefine setter for class A
A parameter {{foo -setter foosetter -default 1}}

a1 foo ;# calls default foo getter
a1 foo 123 ;# calls overridden foosetter
puts foo=[a1 foo]

A create a2
a2 proc foo {args} {
  puts "object specific getter/setter for [self proc] $args"
    switch [llength $args] {
      0 {my set [self proc]}
      1 {my set [self proc] [lindex $args 0]}
      default {error "use [self proc] with 1 or 0 arguments"}
    }
}
a2 foo 567 ;# call proc foo as setter
puts foo=[a2 foo] ;# call proc foo as getter



More information about the Xotcl mailing list