if [llength [info commands p7proc]] { set Compiling true } else { set Compiling false source testing.tcl } if $Compiling { # DEFINE Triangle(n) = 1 + 2 + 3 + ... + n p7proc (int)triangleA { (int)x } { if ( $x < 1 ) { return 0 } return ( $x + [triangleA ($x-1)] ) } p7proc (int)triangleB { (int)x } { set (int)i ($x) set (int)z 0 while ( $x>0 ) { set z ([set z]+[set x]) set x ($x-1) } return $z } p7proc (int)triangleC { (int)x } { set (int)i ($x) set (int)z 0 while ( 1 ) { set z ($z+$x) incr x (0-1) if ( $x<1 ) { break } } set z } p7proc (int)triangleD { (int)x } { set (int)z 0 for {} ($x>0) {set x ($x-1)} { incr z $x } k (z) } p7proc (int)triangleE { (int)x } { loop (int)i $x { incr x $i } k $x } } else { # triangle in normal Tcl proc tcl_triangle {n} { set sum 0 for {set i 1} {$i<=$n} {incr i} { incr sum $i } set sum } AssertEq 0 {tcl_triangle 0} AssertEq 1 {tcl_triangle 1} AssertEq 3 {tcl_triangle 2} AssertEq 6 {tcl_triangle 3} AssertEq 10 {tcl_triangle 4} AssertEq 15 {tcl_triangle 5} for {set i 0} {$i<=20} {incr i} { set t [tcl_triangle $i] AssertEq $t { expr { $i * ($i+1) / 2 } } AssertEq $t { triangleA $i } AssertEq $t { triangleB $i } AssertEq $t { triangleC $i } AssertEq $t { triangleD $i } AssertEq $t { triangleE $i } } Okay }