Version 1 of OO Method calls

Updated 2004-02-22 18:20:18

These are some implementations of the method invocation benchmark of Tcl OO Bench.


ITcl

 package require Itcl

 itcl::class Toggle {
   variable state
   constructor {start_state} {
     set state $start_state
   }
   method value {} {
     return $state
   }
   method activate {} {
     set state [expr {!$state}]
     return $this
   }
 }

 itcl::class NthToggle {
   inherit Toggle
   variable count_max
   variable counter
   constructor {start_state max_counter} {
     Toggle::constructor $start_state
   } {
     set count_max $max_counter
     set counter 0
   }
   method activate {} {
     if {[incr counter] >= $count_max} {
       Toggle::activate
       set counter 0
     }
     return $this
   }
 }

 proc main {} {
   set n [lindex $::argv 0]
   set val 1
   set toggle [Toggle #auto $val]
   for {set i 0} {$i < $n} {incr i} {
     set val [[$toggle activate] value]
   }
   if {$val} {puts "true"} else {puts "false"}

   set val 1
   set ntoggle [NthToggle #auto 1 3]
   for {set i 0} {$i < $n} {incr i} {
     set val [[$ntoggle activate] value]
   }
   if {$val}  {puts "true"} else {puts "false"}
 }

 main

OTcl

 Class Toggle 
 Toggle instproc state {v} {
   $self set state $v
 }
 Toggle instproc value {} {
   $self set state
 }
 Toggle instproc activate {} {
   $self state [expr {! [$self set state]}]
   set self
 } 


 Class NthToggle -superclass Toggle
 NthToggle instproc max {v} {
   $self set max $v
 }
 NthToggle instproc init args {
   eval $self next $args
   $self set counter 0
 }
 NthToggle instproc activate {} {
   $self instvar counter
   if {[incr counter] >= [$self set max]} {
     $self next
     set counter 0
   }
   set self
 }

 proc main {} {
   set n [lindex $::argv 0]
   set val 1
   set toggle [Toggle n -state $val]

   for {set i 0} {$i < $n} {incr i} {        
     set val [[$toggle activate] value]
   }
   if {$val} {puts "true"} else {puts "false"}

   set val 1
   set ntoggle [NthToggle nn -state 1 -max 3]
   for {set i 0} {$i < $n} {incr i} {
     set val [[$ntoggle activate] value]
   }
   if {$val} {puts "true"} else {puts "false"}
 }

 main