Updated 2017-04-21 22:32:33 by LarrySmith
 Of late, I've been using this proc a lot to deal with variable numbers

of arguments that may have different meanings.
 proc > {args} {
    upvar args argl
    set j 0
    foreach arg $args {
      set val [lindex $argl $j]
      if {[string index $val 0] eq "&"} {
        set val [string range $val 1 end]
        uplevel upvar $val $arg
      } else {
        upvar $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.