dwww Home | Manual pages | Find package

NRE(3tcl)                   Tcl Library Procedures                   NRE(3tcl)

______________________________________________________________________________

NAME
       Tcl_NRCreateCommand,  Tcl_NRCallObjProc, Tcl_NREvalObj, Tcl_NREvalObjv,
       Tcl_NRCmdSwap, Tcl_NRExprObj, Tcl_NRAddCallback - Non-Recursive (stack-
       less) evaluation of Tcl scripts.

SYNOPSIS
       #include <tcl.h>

       Tcl_Command
       Tcl_NRCreateCommand(interp, cmdName, proc, nreProc, clientData,
                           deleteProc)

       int
       Tcl_NRCallObjProc(interp, nreProc, clientData, objc, objv)

       int
       Tcl_NREvalObj(interp, objPtr, flags)

       int
       Tcl_NREvalObjv(interp, objc, objv, flags)

       int
       Tcl_NRCmdSwap(interp, cmd, objc, objv, flags)

       int
       Tcl_NRExprObj(interp, objPtr, resultPtr)

       void
       Tcl_NRAddCallback(interp, postProcPtr, data0, data1, data2, data3)

ARGUMENTS
       Tcl_Interp *interp (in)                 The relevant Interpreter.

       const char *cmdName (in)                Name of the command to create.

       Tcl_ObjCmdProc *proc (in)               Called  in  order to evaluate a
                                               command.  Is often just a small
                                               wrapper that uses Tcl_NRCallOb-
                                               jProc to call nreProc  using  a
                                               new trampoline.  Behaves in the
                                               same way as the  proc  argument
                                               to   Tcl_CreateObjCommand(3tcl)
                                               (q.v.).

       Tcl_ObjCmdProc *nreProc (in)            Called instead of proc  when  a
                                               trampoline is already in use.

       ClientData clientData (in)              Arbitrary one-word value passed
                                               to  proc,  nreProc,  deleteProc
                                               and objProc.

       Tcl_CmdDeleteProc *deleteProc (in/out)  Called    before   cmdName   is
                                               deleted from  the  interpreter,
                                               allowing  for  command-specific
                                               cleanup. May be NULL.

       int objc (in)                           Number of items in objv.

       Tcl_Obj **objv (in)                     Words in the command.

       Tcl_Obj *objPtr (in)                    A script or expression to eval-
                                               uate.

       int flags (in)                          As described for Tcl_EvalObjv.

       Tcl_Command cmd (in)                    Token to use instead of one de-
                                               rived from the  first  word  of
                                               objv  in  order  to  evaluate a
                                               command.

       Tcl_Obj *resultPtr (out)                Pointer to an unshared  Tcl_Obj
                                               where the result of the evalua-
                                               tion is stored  if  the  return
                                               code is TCL_OK.

       Tcl_NRPostProc *postProcPtr (in)        A function to push.

       ClientData data0 (in)

       ClientData data1 (in)

       ClientData data2 (in)

       ClientData data3 (in)                   data0  through  data3  are four
                                               one-word values  that  will  be
                                               passed  to  the function desig-
                                               nated by postProcPtr when it is
                                               invoked.
______________________________________________________________________________

DESCRIPTION
       These  functions provide an interface to the function stack that an in-
       terpreter iterates through to evaluate commands.  The routine behind  a
       command  is implemented by an initial function and any additional func-
       tions that the routine pushes onto the stack as it progresses.  The in-
       terpreter itself pushes functions onto the stack to react to the end of
       a routine and to exercise other forms of control such as switching  be-
       tween  in-progress  stacks and the evaluation of other scripts at addi-
       tional levels without adding frames to the C stack.  To execute a  rou-
       tine,  the  initial function for the routine is called and then a small
       bit of code called a trampoline iteratively  takes  functions  off  the
       stack  and calls them, using the value of the last call as the value of
       the routine.

       Tcl_NRCallObjProc calls nreProc using a new trampoline.

       Tcl_NRCreateCommand, an alternative to  Tcl_CreateObjCommand,  resolves
       cmdName,  which  may contain namespace qualifiers, relative to the cur-
       rent namespace, creates a command by that name, and returns a token for
       the  command  which  may be used in subsequent calls to Tcl_GetCommand-
       Name.  Except for a few cases noted below any existing command  by  the
       same  name  is  first  deleted.   If  interp is in the process of being
       deleted Tcl_NRCreateCommand does  not  create  any  command,  does  not
       delete any command, and returns NULL.

       Tcl_NREvalObj pushes a function that is like Tcl_EvalObjEx but consumes
       no space on the C stack.

       Tcl_NREvalObjv pushes a function that is like Tcl_EvalObjv but consumes
       no space on the C stack.

       Tcl_NRCmdSwap  is like Tcl_NREvalObjv, but uses cmd, a token previously
       returned by Tcl_CreateObjCommand or Tcl_GetCommandFromObj,  instead  of
       resolving the first word of objv.

       Tcl_NRExprObj  pushes a function that evaluates objPtr as an expression
       in the same manner as Tcl_ExprObj but without consuming space on the  C
       stack.

       All  of  the  functions  return TCL_OK if the evaluation of the script,
       command, or expression has been scheduled successfully.  Otherwise (for
       example  if the command name cannot be resolved), they return TCL_ERROR
       and store a message as the interpreter's result.

       Tcl_NRAddCallback pushes postProcPtr.  The signature for Tcl_NRPostProc
       is:

              typedef int
              Tcl_NRPostProc(
                      ClientData data[],
                      Tcl_Interp *interp,
                      int result);

       data  is  a pointer to an array containing data0 through data3.  result
       is the value returned by the previous function  implementing  part  the
       routine.

EXAMPLE
       The following command uses Tcl_EvalObjEx, which consumes space on the C
       stack, to evalute a script:

              int
              TheCmdOldObjProc(
                  ClientData clientData,
                  Tcl_Interp *interp,
                  int objc,
                  Tcl_Obj *const objv[])
              {
                  int result;
                  Tcl_Obj *objPtr;

                  ... preparation ...

                  result = Tcl_EvalObjEx(interp, objPtr, 0);

                  ... postprocessing ...

                  return result;
              }
              Tcl_CreateObjCommand(interp, "theCommand",
                      TheCmdOldObjProc, clientData, TheCmdDeleteProc);

       To avoid consuming space on the C stack, TheCmdOldObjProc is renamed to
       TheCmdNRObjProc  and  the  postprocessing step is split into a separate
       function, TheCmdPostProc, which is  pushed  onto  the  function  stack.
       Tcl_EvalObjEx  is  replaced with Tcl_NREvalObj, which uses a trampoline
       instead of consuming space on the C stack.  A  new  version  of  TheCm-
       dOldObjProc  is  just  a  a wrapper that uses Tcl_NRCallObjProc to call
       TheCmdNRObjProc:

              int
              TheCmdOldObjProc(
                  ClientData clientData,
                  Tcl_Interp *interp,
                  int objc,
                  Tcl_Obj *const objv[])
              {
                  return Tcl_NRCallObjProc(interp, TheCmdNRObjProc,
                          clientData, objc, objv);
              }

              int
              TheCmdNRObjProc
                  ClientData clientData,
                  Tcl_Interp *interp,
                  int objc,
                  Tcl_Obj *const objv[])
              {
                  Tcl_Obj *objPtr;

                  ... preparation ...

                  Tcl_NRAddCallback(interp, TheCmdPostProc,
                          data0, data1, data2, data3);
                  /* data0 .. data3 are up to four one-word items to
                   * pass to the postprocessing procedure */

                  return Tcl_NREvalObj(interp, objPtr, 0);
              }

              int
              TheCmdNRPostProc(
                  ClientData data[],
                  Tcl_Interp *interp,
                  int result)
              {
                  /* data[0] .. data[3] are the four words of data
                   * passed to Tcl_NRAddCallback */

                  ... postprocessing ...

                  return result;
              }

       Any function comprising a routine can push other functions,  making  it
       possible implement looping and sequencing constructs using the function
       stack.

SEE ALSO
       Tcl_CreateCommand(3tcl),    Tcl_CreateObjCommand(3tcl),     Tcl_EvalOb-
       jEx(3tcl), Tcl_GetCommandFromObj(3tcl), Tcl_ExprObj(3tcl)

KEYWORDS
       stackless,  nonrecursive,  execute,  command,  global,  value,  result,
       script

COPYRIGHT
       Copyright © 2008 Kevin B. Kenny.  Copyright © 2018 Nathan Coulter.

Tcl                                   8.6                            NRE(3tcl)

Generated by dwww version 1.14 on Thu Jan 23 01:12:39 CET 2025.