The lseq command is part of Tcl 9.0. It generates a sequence of numbers as a list, and is specially optimised to work with foreach.
For example, lseq 5 produces 0 1 2 3 4.
You can specify alternative start points and step sizes, including floating point ones. lseq 0.1 .. 1.0 gives 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 (with no floating point "catastrophe"; the implementation is exceptionally careful about that).
Note that the numeric arguments are really expressions. If they're not literals, please put braces around them.
foreach i [lseq {[string length $abc]}] c [split $abc] {
puts $i->$c
}