manpagez: man pages & more
man Tcl_NRCreateCommand(3)
Home | html | info | man
NRE(3)                      Tcl Library Procedures                      NRE(3)



______________________________________________________________________________


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.

       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(3)
                                               (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
                                               derived 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
       interpreter iterates through to evaluate commands.  The routine  behind
       a  command  is  implemented  by  an initial function and any additional
       functions that the routine pushes onto the stack as it progresses.  The
       interpreter  itself pushes functions onto the stack to react to the end
       of a routine and to exercise other forms of control such  as  switching
       between 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(3),    Tcl_CreateObjCommand(3),     Tcl_EvalObjEx(3),
       Tcl_GetCommandFromObj(3), Tcl_ExprObj(3)


KEYWORDS

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


COPYRIGHT

       Copyright (c) 2008 by Kevin B. Kenny.  Copyright  (c)  2018  by  Nathan
       Coulter.



Tcl                                   8.6                               NRE(3)

tcl 8.6.9 - Generated Fri Nov 16 19:28:29 CST 2018
© manpagez.com 2000-2025
Individual documents may contain additional copyright information.