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 Sun Jul 13 01:38:42 CEST 2025.