Provided by: tcl8.5-doc_8.5.19-1_all bug

NAME

       return - Return from a procedure, or set return code of a script

SYNOPSIS

       return ?result?

       return ?-code code? ?result?

       return ?option value ...? ?result?
________________________________________________________________________________________________________________

DESCRIPTION

       In  its  simplest  usage,  the  return  command  is  used  without  options in the body of a procedure to
       immediately return control to the caller of the procedure.  If a result argument is provided,  its  value
       becomes  the result of the procedure passed back to the caller.  If result is not specified then an empty
       string will be returned to the caller as the result of the procedure.

       The return command serves a similar function within  script  files  that  are  evaluated  by  the  source
       command.   When  source evaluates the contents of a file as a script, an invocation of the return command
       will cause script evaluation to immediately cease, and the value result (or  an  empty  string)  will  be
       returned as the result of the source command.

EXCEPTIONAL RETURN CODES

       In  addition  to  the  result  of  a  procedure, the return code of a procedure may also be set by return
       through use of the -code option.  In the usual case where the -code option is not specified the procedure
       will return normally.  However, the -code option may be used to generate an exceptional return  from  the
       procedure.  Code may have any of the following values:

       ok (or 0)    Normal  return:   same  as  if the option is omitted.  The return code of the procedure is 0
                    (TCL_OK).

       error (1)    Error return: the return code of the procedure is  1  (TCL_ERROR).   The  procedure  command
                    behaves  in  its  calling  context  as  if  it were the command error result.  See below for
                    additional options.

       return (2)   The return code of the procedure is 2 (TCL_RETURN).  The procedure command  behaves  in  its
                    calling context as if it were the command return (with no arguments).

       break (3)    The  return  code  of  the procedure is 3 (TCL_BREAK).  The procedure command behaves in its
                    calling context as if it were the command break.

       continue (4) The return code of the procedure is 4 (TCL_CONTINUE).  The procedure command behaves in  its
                    calling context as if it were the command continue.

       value        Value must be an integer;  it will be returned as the return code for the current procedure.

       When  a  procedure  wants  to  signal  that it has received invalid arguments from its caller, it may use
       return -code error with result set to a suitable error message.  Otherwise  usage  of  the  return  -code
       option is mostly limited to procedures that implement a new control structure.

       The  return  -code  command  acts similarly within script files that are evaluated by the source command.
       During the evaluation of the contents of a file as a script by source, an invocation of the return  -code
       code command will cause the return code of source to be code.

RETURN OPTIONS

       In  addition  to a result and a return code, evaluation of a command in Tcl also produces a dictionary of 2
       return options.  In general usage, all option value pairs given as arguments to return become entries  in 2
       the  return  options  dictionary,  and any values at all are acceptable except as noted below.  The catch 2
       command may be used to capture all of this information — the return code,  the  result,  and  the  return 2
       options dictionary — that arise from evaluation of a script.

       As  documented above, the -code entry in the return options dictionary receives special treatment by Tcl.
       There are other return options also recognized and treated specially by Tcl.  They are:

       -errorcode list
              The -errorcode option receives special treatment only when  the  value  of  the  -code  option  is
              TCL_ERROR.   Then  the list value is meant to be additional information about the error, presented
              as a Tcl list for further processing by programs.  If no -errorcode option is provided  to  return
              when  the  -code  error  option is provided, Tcl will set the value of the -errorcode entry in the
              return options dictionary to the default value of NONE.  The -errorcode return option will also be
              stored in the global variable errorCode.

       -errorinfo info
              The -errorinfo option receives special treatment only when  the  value  of  the  -code  option  is
              TCL_ERROR.   Then  info  is the initial stack trace, meant to provide to a human reader additional
              information about the context in which the error occurred.  The stack trace will also be stored in
              the global variable errorInfo.  If no -errorinfo option is provided to return when the -code error
              option is provided, Tcl will  provide  its  own  initial  stack  trace  value  in  the  entry  for
              -errorinfo.   Tcl's  initial  stack  trace  will include only the call to the procedure, and stack
              unwinding will append information about higher stack levels, but  there  will  be  no  information
              about  the  context  of the error within the procedure.  Typically the info value is supplied from
              the value of -errorinfo in a return options dictionary captured by the catch command (or from  the
              copy of that information stored in the global variable errorInfo).

       -level level
              The  -level  and  -code  options work together to set the return code to be returned by one of the 2
              commands currently being evaluated.  The level value must be a non-negative integer representing a 2
              number of levels on the call stack.  It defines the number of levels up the  stack  at  which  the 2
              return  code  of  a  command  currently  being  evaluated  should be code.  If no -level option is 2
              provided, the default value of level is 1, so that return sets the return code  that  the  current 2
              procedure  returns to its caller, 1 level up the call stack.  The mechanism by which these options 2
              work is described in more detail below.

       -options options
              The value options must be a valid dictionary.  The entries  of  that  dictionary  are  treated  as 2
              additional option value pairs for the return command.

RETURN CODE HANDLING MECHANISMS

       Return  codes  are  used in Tcl to control program flow.  A Tcl script is a sequence of Tcl commands.  So
       long as each command evaluation returns a return code of TCL_OK, evaluation will  continue  to  the  next
       command  in the script.  Any exceptional return code (non-TCL_OK) returned by a command evaluation causes
       the flow on to the next command to be interrupted.  Script evaluation ceases, and the exceptional  return
       code  from  the  command becomes the return code of the full script evaluation.  This is the mechanism by
       which errors during script evaluation cause an interruption and unwinding of the call stack.  It is  also
       the  mechanism  by  which  commands like break, continue, and return cause script evaluation to terminate
       without evaluating all commands in sequence.

       Some of Tcl's built-in commands evaluate scripts as part of their functioning.  These commands  can  make
       use  of exceptional return codes to enable special features.  For example, the built-in Tcl commands that
       provide loops — such as while, for, and foreach — evaluate a script that is the body  of  the  loop.   If
       evaluation  of  the  loop body returns the return code of TCL_BREAK or TCL_CONTINUE, the loop command can
       react in such a way as to give the break and continue commands their documented interpretation in loops.

       Procedure invocation also involves evaluation  of  a  script,  the  body  of  the  procedure.   Procedure 2
       invocation  provides  special  treatment  when  evaluation  of the procedure body returns the return code 2
       TCL_RETURN.  In that circumstance, the -level entry in the return options dictionary is decremented.   If 2
       after  decrementing,  the  value  of the -level entry is 0, then the value of the -code entry becomes the 2
       return code of the procedure.  If after decrementing, the value of the -level entry is greater than zero, 2
       then the return code of the procedure is TCL_RETURN.  If the procedure  invocation  occurred  during  the 2
       evaluation  of  the  body  of  another  procedure,  the  process  will  repeat  itself up the call stack, 2
       decrementing the value of the -level entry at each level, so that the code will be the return code of the 2
       current command level levels up the call stack.  The source command performs the  same  handling  of  the 2
       TCL_RETURN  return  code,  which  explains  the similarity of return invocation during a source to return 2
       invocation within a procedure.                                                                            2

       The return code of the return command itself triggers this special handling by procedure invocation.   If 2
       return  is  provided  the  option -level 0, then the return code of the return command itself will be the 2
       value code of the -code option (or TCL_OK by default).  Any other value for the -level option  (including 2
       the  default  value  of  1)  will  cause  the  return code of the return command itself to be TCL_RETURN, 2
       triggering a return from the enclosing procedure.

EXAMPLES

       First, a simple example of using return to return from a procedure, interrupting the procedure body.
              proc printOneLine {} {
                 puts "line 1"    ;# This line will be printed.
                 return
                 puts "line 2"    ;# This line will not be printed.
              }

       Next, an example of using return to set the value returned by the procedure.
              proc returnX {} {return X}
              puts [returnX]    ;# prints "X"

       Next, a more complete example, using return -code error to report invalid arguments.
              proc factorial {n} {
                 if {![string is integer $n] || ($n < 0)} {
                    return -code error \
                          "expected non-negative integer,\
                           but got \"$n\""
                 }
                 if {$n < 2} {
                    return 1
                 }
                 set m [expr {$n - 1}]
                 set code [catch {factorial $m} factor]
                 if {$code != 0} {
                    return -code $code $factor
                 }
                 set product [expr {$n * $factor}]
                 if {$product < 0} {
                    return -code error \
                          "overflow computing factorial of $n"
                 }
                 return $product
              }

       Next, a procedure replacement for break.
              proc myBreak {} {
                 return -code break
              }

       With the -level 0 option, return itself can serve as a replacement for break.                             2
              interp alias {} Break {} return -level 0 -code break                                               2

       An example of using catch and return -options to re-raise a caught error:                                 2
              proc doSomething {} {                                                                              2
                 set resource [allocate]                                                                         2
                 catch {                                                                                         2
                    # Long script of operations                                                                  2
                    # that might raise an error                                                                  2
                 } result options                                                                                2
                 deallocate $resource                                                                            2
                 return -options $options $result                                                                2
              }                                                                                                  2

       Finally an example of advanced use of the return options to create a  procedure  replacement  for  return 2
       itself:                                                                                                   2
              proc myReturn {args} {                                                                             2
                 set result ""                                                                                   2
                 if {[llength $args] % 2} {                                                                      2
                    set result [lindex $args end]                                                                2
                    set args [lrange $args 0 end-1]                                                              2
                 }                                                                                               2
                 set options [dict merge {-level 1} $args]                                                       2
                 dict incr options -level                                                                        2
                 return -options $options $result                                                                2
              }                                                                                                  2

SEE ALSO

       break(3tcl),    catch(3tcl),   continue(3tcl),   dict(3tcl),   error(3tcl),   proc(3tcl),   source(3tcl),
       tclvars(3tcl)

KEYWORDS

       break, catch, continue, error, procedure, return

Tcl                                                    8.5                                          return(3tcl)