# Instantiate three class, Pair Pair & Pair, # using a fancyclass definition in generic_pair.p7i. if [llength [info commands p7proc]] { set Compiling true } else { set Compiling false source testing.tcl } if $Compiling { foreach TYPE {int byt uni} { p7source generic_pair.p7i TYPE $TYPE # Demo using the generated getters and setters from compiled p7proc # (even though they really are meant for access from Tcl). p7proc (void)doubleEachField (Pair<$TYPE>)this [string map "TYPE $TYPE" { # Must cast the (tcl) returned from get_ back to TYPE. # 'set' with a (type) but no variable name is just a cast command. set_left $this (2 * [set (TYPE) [get_left $this]]) set_right $this (2 * [set (TYPE) [get_right $this]]) }] } } else { AssertEq [list Pair 5 25] { toList [Pair 5 25] } AssertEq [list Pair 5 25] { toList [Pair 5 25] } AssertEq [list Pair 5 25] { toList [Pair 5 25] } AssertEq [list Pair 10 50] { set p [Pair 5 25]; doubleEachField $p; toList $p } # now demonstrate calling getters and setters from Tcl set q [ Pair 33 -44 ] set_left $q [expr { -1 * [get_left $q] }] set_right $q [expr { 2 * [get_right $q] }] AssertEq [list Pair -33 -88] { toList $q } # construct 3 objects in a list. set objects [ list [Pair 1 10] [Pair 2 20] [Pair 3 30] ] # build a list z, with all their types and members foreach obj $objects { # find the object's type set classname [ typeof $obj ] # find what its members are set members [ members $obj ] # we already know the answer AssertEq "left right" {set members} lappend z TYPE $classname foreach m $members { lappend z $m [get_$m $obj] } } AssertEq "TYPE Pair left 1 right 10 TYPE Pair left 2 right 20 TYPE Pair left 3 right 30" {set z} Okay }