Version 9 of info level

Updated 2008-06-30 09:52:53 by dkf

info level ?number?

If number is not specified, this command returns a number giving the stack level of the invoking procedure, or 0 if the command is invoked at top-level. If number is specified, then the result is a list consisting of the name and arguments for the procedure call at level number on the stack. If number is positive then it selects a particular stack level (1 refers to the top-most active procedure, 2 to the procedure it called, and so on); otherwise it gives a level relative to the current level (0 refers to the current procedure, -1 to its caller, and so on). See the uplevel command for more information on what stack levels mean.


See also:


MGS [2003/09/09] - Note that info level 0 does not return values for optional arguments (if they have not been specified):

 proc foo {bar {baz NULL}} {
   puts "info level 0 = \[[info level 0]\]"
 }

   # example1
   foo abc def
   # example2
   foo abc

prints:

 info level 0 = [foo abc def]
 info level 0 = [foo abc]

DGP Correct. [info level $level] returns the substituted list of values that make up the actual command as evaluated.

To get values for non-specified default arguments, you have to do quite a bit more work using info args, info default.

This proc will print out info for all args in the calling proc (note: does not handle being called from global level).

 proc arginfo {} {
   set proc [lindex [info level -1] 0]
   set which [uplevel [list namespace which -command $proc]]
   puts "proc \[$which\]"
   set i -1
   foreach arg [info args $which] {
     incr i
     set value [uplevel [list set $arg]]
     if { [info default $which $arg def] } {
       puts "  arg\[$i\] \[$arg\] = \[$value\] default = \[$def\]"
     } else {
       puts "  arg\[$i\] \[$arg\] = \[$value\]"
     }
   }
 }

 # test code
 proc test {foo {"bar baz" "BAR BAZ"}} {
   arginfo
 }

 test abc
 test abc def

which prints the output:

 proc [::test]
   arg[0] [foo] = [abc]
   arg[1] [bar baz] = [BAR BAZ] default = [BAR BAZ]
 proc [::test]
   arg[0] [foo] = [abc]
   arg[1] [bar baz] = [def] default = [BAR BAZ]