Version 12 of info

Updated 2003-03-19 16:41:46

http://purl.org/tcl/home/man/tcl8.4/TclCmd/info.htm


What are some common uses of the info command in day to day programming?

info cmdcount

With info, you can find out about your tcl environment. For example

info complete script
 proc ls {{ns ::} {all no}} {
        puts "namespace   $ns"
        foreach child [namespace children $ns] {
                if {"all" == $all} {
                        list $child all
                } {
                        puts "namespace   $child"}}
        set pat "[set ns]::*"
        foreach proc [info procs $pat] {
                puts "proc        $proc"}
        foreach var [info vars $pat] {
                if {[array exists $var]} {
                        puts "array       $var"
                } {
                        puts "variable    $var"}}}
info coroutine

See tkinspect


In response to a question about finding a way to tell who called a particular proc, Bruce Hartweg wrote on news:comp.lang.tcl (in message [email protected] ): In How can I tell where a proc was called , comp.lang.tcl, 2001-05-30, in response to a question about finding a way to tell who called a particular proc, Bruce Hartweg wrote (modified):

 # quick tester:

proc who_called {} {

 proc who_called {} {
    puts "I was called from '[lindex [info level -1] 0]' - but first  call was to
 '[lindex [info level 1] 0]'"
 }

proc a {} who_called

 proc a {} {who_called}
 proc b {} {who_called}
 proc c {} {who_called}
 proc d {} {a}
 proc e {n} {$n}

# end

 # end

Output:

 Output:
 % a
 I was called from 'a' - but first call was to 'a'
 % b
 I was called from 'b' - but first call was to 'b'
 % c
 I was called from 'c' - but first call was to 'c'
 % d
 I was called from 'a' - but first call was to 'd'
 % e a
 I was called from 'a' - but first call was to 'e'
 % e b
 I was called from 'b' - but first call was to 'e'
 % e c
 I was called from 'c' - but first call was to 'e'
 % e d
 I was called from 'a' - but first call was to 'e'
----

And [Will Taylor] writes:
I find a backtrace useful -- putting these two stmts in the proc in question:
I find a backtrace useful -- putting these two stmts in the
proc in question:
set backtrace ""; getBackTrace backtrace
puts stderr "<the-proc-in-question>: `$backtrace'"
 proc getBackTrace { backTraceRef } {
  upvar $backTraceRef backTrace
    set startLevel [expr {[info level] - 2}]
  set startLevel [expr {[info level] - 2}]
  for {set level 1} {$level <= $startLevel} {incr level} {
    append backTrace "[lindex [info level $level] 0] => "
  }
 }

Note also that the Bag of algorithms makes a couple of mentions of backtracing, and even has other uses of [info ...].


AM A common idiom that I use:

    set scriptdir [file dirname [info script]]
so that I know where my other scripts or data files that need to be sourced/read are located. 

Another use: detect the difference between running the script [main script%|%on its own] or as a package:
Another use: detect the difference between running the script on its own or as a package:
   if { [file tail [info script]] == [file tail $::argv0] } {
      # The script is running on its own!
   }

There is one particular caveat: the command will return an empty string when it is called in an event handler - then there is no script being "sourced" anymore! So, save the result when you need it later on (that is: later on in the process, not later in the source file). There is one particular caveat: the command will return an empty string when it is called in an event handler - then there is no script being "sourced" anymore! So, save the result when you need it later on (that is: later on in the process, not later in the source file).

See also:


Tcl syntax help - Arts and crafts of Tcl-Tk programming - Category Command