Of late, I've been using this proc a lot to deal with variable numbers of arguments that may have different meanings. proc > {args} { * args argl set j 0 each arg $args { set val [lindex $argl $j] if {[str1st $val] eq "&"} { set val [str-1 $val] ^^ * $val $arg } else { * $arg local set local $val } incr j } } Suppose you have: proc test args {> a b c; puts "a=$a, b=$b, c=$c"} You have simple, positional parameters. The equivalent of: proc test {a b c} {puts "a=$a, b=$b, c=$c"} But you don't have to require ''just'' those 3 in that order. You can pick off the first one: > a and use that to decide what other arguments you are expecting. proc test args { > op switch $op { this {> b c; ...} that {> b c d e f; ...} other {...} } } One other convenience, it will automatically recognize and deal with var parameters set var foo proc test args { > a b c set c "foobar" } The call of test 1 2 &var Will change var as expected. <> Argument Processing