proc interleave {args} {
if {[llength $args] == 0} {return {}}
set data {}
set idx 0
set head {}
set body "lappend data"
foreach arg $args {
lappend head v$idx $arg
append body " \$v$idx"
incr idx
}
eval foreach $head [list $body]
return $data
}But I made it pretty general--- it can handle any number of args, also arguments with unequal lengths. Check it:
% set keys {one two three four }
% set vals {uno dos tres cuatro}
% array set numbers [interleave $keys $vals]
% parray numbers
numbers(four) = cuatro
numbers(one) = uno
numbers(three) = tres
numbers(two) = dos
% interleave {a1 a2 a3 a4} {b1 b2 b3 b4} {c1 c2 c3 c4} {d1 d2 d3 d4}
a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3 a4 b4 c4 d4
% set elems {when 900 years old you reach look as good you will not}
% array set my_set [interleave $elems {}]
% array names my_set
will as years not good look you 900 when reach oldWith {*} I should be able to change that second-to-last line to simply "foreach {*}$head $body".MAKR 2009-04-09 a simpler implementation that is zipping two lists can be found at [lzip].

