return(3tcl)



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 return options.   In  general  usage, 
   all  option  value pairs given as arguments to return become entries in 
   the return options dictionary, and any values  at  all  are  acceptable 
   except as noted below.  The catch command may be used to capture all of 
   this information --- the return code, the result, and the return  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 commands currently being 
          evaluated.  The level  value  must  be  a  non-negative  integer 
          representing  a  number of levels on the call stack.  It defines 
          the number of levels up the stack at which the return code of  a 
          command  currently being evaluated should be code.  If no -level 
          option is provided, the default value of level  is  1,  so  that 
          return  sets  the return code that the current procedure returns 
          to its caller, 1 level up the  call  stack.   The  mechanism  by 
          which these options 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 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  invocation provides special treatment when 
   evaluation of the procedure body returns the  return  code  TCL_RETURN. 
   In that circumstance, the -level entry in the return options dictionary 
   is decremented.  If after decrementing, the value of the  -level  entry 
   is  0, then the value of the -code entry becomes the return code of the 
   procedure.  If after decrementing, the value of  the  -level  entry  is 
   greater than zero, then the return code of the procedure is TCL_RETURN. 
   If the procedure invocation occurred during the evaluation of the  body 
   of another procedure, the process will repeat itself up the call stack, 
   decrementing the value of the -level entry at each level, so  that  the 
   code will be the return code of the current command level levels up the 
   call stack.  The source command  performs  the  same  handling  of  the 
   TCL_RETURN  return  code,  which  explains  the  similarity  of  return 
   invocation during a source to return invocation within a procedure.     

   The return code of the return  command  itself  triggers  this  special 
   handling  by  procedure  invocation.   If return is provided the option 
   -level 0, then the return code of the return command itself will be the 
   value code of the -code option (or TCL_OK by default).  Any other value 
   for the -level option (including the default value of 1) will cause the 
   return code of the return command itself to be TCL_RETURN, 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.                                                                  
          interp alias {} Break {} return -level 0 -code break             

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

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

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




Free and Open Source Software


Free Software Video

Useful Programs

Free Online Courses

Open Opportunity

Open Business