Updated 2007-02-21 13:01:04

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

Category Itcl Category Data Structure