What would it take to do classic iterators in Tcl? Do we need 'em? Dunno, but here is a contrived example in Itcl for the curious. -- Todd Coram
package require Itcl itcl::class BiDirectionalIterator { variable pos -1 variable end -1 method first {} { set pos 0 return $this } method next {{inc 1}} { set pos [expr {$pos + $inc}] if {$pos <= $end} { return $this } return {} } method prev {{decr 1}} { set pos [expr {$pos - $decr}] if {$pos >= 0} { return $this } return {} } method last {} { set pos $end return $this } method value {} abstract } itcl::class String { inherit BiDirectionalIterator variable string constructor {str} { set string $str set end [string length $str] } method value {} { return [string index $string $pos] } } itcl::class Tuple { inherit BiDirectionalIterator variable tuple constructor {tp} { set tuple $tp set end [llength $tuple] } method value {} { return [lindex $tuple $pos] } } proc reverse {obj} { set iter [$obj last] puts -nonewline "Reversed = <" while {$iter != {}} { puts -nonewline [$iter value] set iter [$iter prev] } puts ">" } proc every_other {obj} { set iter [$obj first] puts -nonewline "Every other = <" while {$iter != {}} { puts -nonewline [$iter value] set iter [$iter next 2] } puts ">" } String s "Hello World!" Tuple t {1 2 3 4 5 6} reverse s reverse t every_other s every_other t