Updated 2017-12-01 10:00:20 by foo

info level indicates the current level, and can also describe the command for the current level.

See also  edit

uplevel

synopsis  edit

info level ?number?

Description  edit

If number is specified, info levels returns a list consisting of words of the command for the level indicated by number. A number greater than 0 indicates the level identified by that number. 0 indicates the current level, -1 indicates one level prior to the current level, -2 indicates the level prior to that one, and so on.

If number is not specified, info level returns a number indicating the current level, i.e. the level from which info level was called. 0 is top level, and each subsequent level is incremented by 1.

Discussion  edit

MGS 2003-09-09: 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 and 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

hich 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]