if [llength [info commands p7proc]] { set Compiling true } else { set Compiling false source testing.tcl } if $Compiling { foreach T {int double tcl} { eval [ string map " T $T " { p7proc (T**)new2d { (int)p (int)q } { set (T**)z [ new (T**) $p ] loop (int)i $p { set z($i) [ new (T*) $q ] } return $z } p7class Matrix2d { (T**)vv } p7proc (Matrix2d)Matrix2d { (int)p (int)q } { new (Matrix2d)z set z(vv) [ new2d $p $q ] set z } p7proc (void)set2d { (Matrix2d)this (int)p (int)q (T)value } { set vv(p)(q) $value } p7proc (T)get2d { (Matrix2d)this (int)p (int)q } { set vv(p)(q) } p7proc (T*)get2d { (Matrix2d)this (int)p } { set vv(p) } p7proc (T**)get2d { (Matrix2d)this } { set vv } } ] } } else { AssertEq {{0 0 0 0} {0 0 0 0} {0 0 0 0}} { new2d 3 4 } set m [ Matrix2d 3 4 ] AssertEq {{0 0 0 0} {0 0 0 0} {0 0 0 0}} { get2d $m } AssertEq {0 0 0 0} { get2d $m 1 } AssertEq 0 { get2d $m 1 1 } set2d $m 1 1 8 AssertEq {{0 0 0 0} {0 8 0 0} {0 0 0 0}} { get2d $m } AssertEq {0 8 0 0} { get2d $m 1 } AssertEq 8 { get2d $m 1 1 } set m [ Matrix2d 3 4 ] set2d $m 2 2 7.5 AssertEq {{0.0 0.0 0.0 0.0} {0.0 0.0 0.0 0.0} {0.0 0.0 7.5 0.0}} { get2d $m } set m [ Matrix2d 3 4 ] AssertEq {{{} {} {} {}} {{} {} {} {}} {{} {} {} {}}} { get2d $m } set2d $m 0 0 banana AssertEq {{banana {} {} {}} {{} {} {} {}} {{} {} {} {}}} { get2d $m } Okay }