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.
MGS [2004/03/15] - Are you saying that info level 0 and info level [info level] should return different things? They appear to return the same.
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]