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?
With info, you can find out about your tcl environment. For example
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"}}}
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: 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] => " } }
The Bag of algorithms makes a couple of mentions of backtracing, and even has other uses of info ... . 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).
See also:
Tcl syntax help - Arts and Crafts of Tcl-Tk Programming - Category Command