TIP #65: ENHANCED [INFO ARGS] =============================== Version: $Revision: 1.6 $ Author: Glenn Jackman Don Porter Glenn Jackman State: Rejected Type: Project Tcl-Version: 8.5 Vote: Done Created: Tuesday, 18 September 2001 URL: https://tip.tcl-lang.org65.html Post-History: ------------------------------------------------------------------------- ABSTRACT ========== This TIP proposes a new subcommand to the [info] command be added that would return the list of arguments, together with any default values in the same format as the /args/ parameter to the [proc] command. INTRODUCTION ============== The [proc] man page defines /args/ as: ... the formal arguments to the procedure. It consists of a list, possibly empty, each of whose elements specifies one argument. Each argument specifier is also a list with either one or two fields. If there is only a single field in the specifier then it is the name of the argument; if there are two fields, then the first is the argument name and the second is its default value. Suppose we define a procedure like this: proc test {one {two 2} {three {3 4 5}} args} {return} We want to determine the formal arguments for this procedure. We want some method to return the list: one {two 2} {three {3 4 5}} args [info args] fails us because it does not return default values, only the list of argument names {one two three args}. The [info default] command exists, and does partially what we want. However [info default] only operates on a single argument. To determine the complete list of arguments with default values, we must iterate over the arguments returned by [info args]. We would define a procedure like: proc info_args_with_defaults {procname} { set argspec [list] # [info args] throws an error if $procname is not a procedure. foreach arg [info args $procname] { if {[info default $procname $arg value]} { lappend argspec [list $arg $value] } else { lappend argspec $arg } } return $argspec } info_args_with_defaults test ;# ==> returns {one {two 2} {three {3 4 5}} args} A more sophisticated scripted solution is to overload the [info] command itself, as described in the Wiki at It would be much more convenient to be able to rely on the [info] command itself to return the desired information, particularly since it /almost/ does what we want already. /This topic was originally raised in the newsgroup in the thread / SPECIFICATION =============== Add [info formalargs] to the set of subcommands for Tcl's built-in [info] command, with syntax: info formalargs $procName This command will raise an error if /$procName/ is not the name of a proc. Otherwise, it will return a list of formal arguments of the named proc, along with their default values, if any, in a format suitable for passing to the [proc] command as a second argument. RATIONALE =========== With the goal of maintaining backwards compatibility in mind, two possibilities arise: adding a new switch to the existing [info args] command, and adding a completely new subcommand to [info]. Adding a switch to [info args] may break backwards compatibility. If we use the syntax [info args /?-withdefaults? procname/], there may be trouble with existing scripts containing a procedure named "-withdefaults". The syntax [info args /procname ?-withdefaults?/] is completely backwards compatible. However, among Tcl commands that take subcommands, there is currently some inconsistency as to where switches should appear. [clock] subcommands place these options after required parameters. [namespace] and [package] subcommands place these options before required parameters. Some [file] subcommands put them before, some after. Currently, no [info] subcommands take switches. Rather than compound to this inconsistency, creating a new [info] subcommand feels cleaner. Possible names include: argspec, arglist, args_with_defaults: These all collide with the "arg", "ar", "a" shorthands for [info args /procname/]. And /args_with_defaults/ is just *way* too ugly. formalargs, fullargs: Either of these could be used. This collides with the "f" shorthand for [info functions] parameters: This collides with the "pa" shorthand for [info patchlevel] prototype: This collides with the "pro" and "pr" shorthands for [info procs /?pattern?/] signature: This could be used, as it does not collide with any shorthand for either [info script] or [info sharedlibextension]. The term "signature" has meaning in the Java and C++ worlds: the function name and its arguments together comprise the signature. The purpose of this TIP is to return only the arguments with any defaults, so to avoid any potential confusion I will rule out "signature". Of the remaining possibilities, my choice would be "formalargs". The term "formal arguments" is used in the [proc] man page. "formalargs" also incorporates the word "args", indicating a relationship to [info args]. REFERENCE IMPLEMENTATION ========================== Refer to the submitted patch, which implements an subcommand named [info fullargs], at: REASONS FOR REJECTION ======================= Those voting against this proposal believed that since the desired functionality is already possible with a short script of just a few Tcl commands, it would be unnecessary bloat to add another subcommand. Some also pointed to [TIP #112] as another approach to letting people extend Tcl built-in commands with their own custom subcommands. COPYRIGHT =========== This document has been placed in the public domain. ------------------------------------------------------------------------- TIP AutoGenerator - written by Donal K. Fellows