[Xotcl] nx parameters

Gustaf Neumann neumann at wu-wien.ac.at
Mon Dec 20 09:03:58 CET 2010

On 19.12.10 21:37, Victor Mayevski wrote:
> Although your examples do seem to work on Object objects, the Class
> instances do not work right.
They work "right", but maybe not as you expected.
You original question was:

>  Is there any way to add meta-data to parameters during parameter
>  creation? Specifically I would like to add a time stamp to the the
>  parameter so I can list parameters in the order they were created.

The following code snippet adds meta-data to every 
"attribute" (similar
to "-parameters" in XOTcl) when it is created. More 
technically, the method
"attribute" creates a slot-object on the class or object, on 
which it is created.
These slot objects are extended in this example by an 
additional instance
variable named "timestamp".
> nx::Class create C {
>   # Create attributes "x" and "y" and script the initialization of
>   # these attributes.
>   :attribute x {
>     set :timestamp [clock clicks]
>   }
>   :attribute y {
>     set :timestamp [clock clicks]
>   }
>   :create c1
> }
Note, that the slot objects are created at the time, when 
the method
"attribute" is called, in the code above at the time, when 
class "C" is
created, before the object c1.

Slot objects provide common meta-data for all their managed 
variables. Typical examples for such meta-data are a default 
a value checker, a linkage to a database table/attribute,
the sql-type of the attribute, a label for pretty printing, 
a widget
for data entry, .....). If an attribute is defined on a 
class, it is
created per-class, not per class instance (that would be too
costly in most situations).
> if I do [C create c2] and then [print_slots_and_timestamps c2], the
> actual output is still for instance c1, not c2,
of, course, if one creates two instances of C (such as c1 
and c2),
these will share the same slot objects (in the example 
above, the slot
objects are named C::slot::x and C::slot::y; normally, the names
of the slot objects won't interest you).

If you want to create unique timestamps per attribute value,
i would recommend to combine a timestamp from the object
creation time with the a timestamp from the slot object
creation (see below)

best regards
-gustaf neumann

proc print_slots_and_timestamps {obj} {
   foreach slot [$obj info lookup slots] {
     if {[$slot eval {info exists :timestamp}]} {
       puts "$obj has attribute [$slot name] \
          timestamp [$obj T].[$slot eval {set :timestamp}]"
nx::Class create C {
   :attribute x {set :timestamp [clock clicks]}
   :attribute y {set :timestamp [clock clicks]}
   :attribute {T "[clock clicks]"}
   :create c1
   :create c2
print_slots_and_timestamps c1
print_slots_and_timestamps c2

More information about the Xotcl mailing list