info - Return information about the state of the Tcl interpreter ---- '''info''' ''option ?arg arg ...?'' ** Synopsis ** * '''[info args]''' ''procname'' * '''[info body]''' ''procname'' * '''[info cmdcount]''' * '''[info commands]''' ''?pattern?'' * '''[info complete]''' ''command'' * '''[info default]''' ''procname arg varname'' * '''[info exists]''' ''varName'' * '''[info functions]''' ''pattern'' * '''[info globals]''' ''?pattern?'' * '''[info hostname]''' * '''[info level]''' ''?number?'' * '''[info library]''' * '''[info loaded]''' ''?interp?'' * '''[info locals'''] ''?pattern?'' * '''[info nameofexecutable]''' * '''[info patchlevel]''' * '''[info procs]''' ''?pattern?'' * '''[info script]''' ''?filename?'' * '''[info sharedlibextension]''' * '''[info tclversion]''' * '''[info vars]''' ''?pattern?'' '''`info`''' ''`option`'' ''`?arg arg ...?`'': ---- '''`[info args]`''' ''`procname`'': http://purl.org/tcl/home/man/tcl8.4/TclCmd/info.htm '''`[info body]`''' ''`procname`'': ---- '''`[info class]`''' ''`subcommand class …`'': What are some common uses of the info command in day to day programming? '''`[info cmdcount]`''': ---- '''`[info commands]`''' ''`?pattern?`'': 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 [https://groups.google.com/d/msg/comp.lang.tcl/uKX9hWPMECc/SwlSBxTdJF4J%|%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): 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 3B157767.A720881E@raytheon.com ): ====== # 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: ======none % 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' ---- [Will Taylor] writes: And [Will Taylor] writes: I find a backtrace useful -- putting these two stmts in the proc in question: ====== set backtrace ""; getBackTrace backtrace puts stderr ": `$backtrace'" Here is the backtrace proc: ====== 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: [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: ** See Also ** * [Determining the Applications Root Directory] * [Making a Path Absolute] ---- [Tcl syntax help] - [Arts and Crafts of Tcl-Tk Programming] - [Category Command] - [Category Introspection]