Version 15 of args

Updated 2004-12-09 17:07:22

Special name for an argument to a proc - if it's last in the argument list, it will contain a list (possibly empty) of all the remaining arguments.

 proc demo {first {second "none"} args} {
        puts "first = $first"
        puts "second = $second"
        puts "args = $args"
 }

 demo one
 demo one two
 demo one two three four five

results in:

  first = one
  second = none
  args = 
  first = one
  second = two
  args = 
  first = one
  second = two
  args = three four five

example args

   Class Club -parameter {id {name unknown}}
   Class Player -superclass Club -parameter {{name unknown} {position unknown}}

   Player proc show_players '''args''' {
     if { [string length $args] == 0} {
       puts "Show players DB"
       foreach p [my info instances] {
         puts "[$p name] [$p position]"
       }
       return
     }

     set pos [string toupper $args]
     puts "Players with postition $pos:"
     foreach p [my info instances] {
       foreach char [split $pos {}] {
         if {[string first $char [$p position]] == 1} {
           puts "[$p name] [$p position]"
           break
         }
       }
     }
   }

Is it just me, or is that a pretty poor example of args? for one, it uses rather unconventional quoting (what's with all the single quotes?). Second, you do [string length $args] and [string toupper $args] but you firmly established that args is a list, not a string. It is generally accepted as bad practice to perform string operations on lists.


MG offers a quick example off the top of his head (and therefore untested), on his way through...

 proc randomCmd {args} {

   set error {wrong # args: should be "randomCmd ?-arg value ...? string"}
   set num [llength $args]
   if { $num == "0" || [expr {($num%2)==0}] } {
        error $error;
      }
  array set opts [list -width 5 -height 5 -fg [list] -bg [list] -foreground blue -background red]
  if { $num > 1 } {
       foreach {x y} [lrange $args 0 end-1] {
                if { ![info exists opts($x)] } {
                     error "unknown option \"$x\"";
                   }
                set opts($x) $y
               }
       }
       foreach {x y} [list -fg -foreground -bg -background] {
                if { [llength $opts($x)] > 0 } {
                     set opts($y) $opts($x)
                   }
                unset opts($x)
               }
     }

   echo "String is \"[lindex $args end]\". Apply these options: [array get opts]"
 }

See also magic names.


Category Documentation