如何使嵌入式 Tcl 解释器保留 Tcl_CreateObjCommand 以供交互使用?
How to make embedded Tcl interpreter keep Tcl_CreateObjCommand for interactive use?
我正在努力在我的应用程序中嵌入一个 TCL 解释器,如果我将一个 Tcl 脚本添加到命令行,我的命令就会被执行并运行。因此,如果我有一个 *.tcl
脚本和一个像 my_command 1
这样的命令,那么 myCmd 过程将在库中执行。然后出现 Tcl 提示符 (%) 这样我就可以交互式地输入更多的命令。如果我再次输入命令,即使命令已经创建,也无法识别命令。
我的代码结构如下。在名为 My.so
的库中,我有这些函数。
int myCmd(ClientData store, Tcl_Interp *interp, int objc, Tcl_Obj * CONST *objv) {
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "my");
return TCL_ERROR;
}
val = Tcl_GetStringFromObj(objv[0], &valLen);
// ...
return TCL_OK;
}
int My_Init(Tcl_Interp *interp) {
Tcl_CreateObjCommand(interp, "my_command", myCmd, (ClientData) NULL, NULL);
// ...
if (inFile != NULL)
Tcl_EvalFile(interp, inFile);
// ...
return TCL_OK;
}
在 main.cpp 我有 ...
int Tcl_AppInit(Tcl_Interp *interp)
{
// ...
interp = Tcl_CreateInterp();
if (interp == NULL)
return TCL_ERROR;
if (Tcl_Init(interp) == TCL_ERROR)
return TCL_ERROR;
if (My_Init(interp) == TCL_ERROR)
return TCL_ERROR;
return TCL_OK;
}
int main(int argc, char* argv[]) {
Tcl_FindExecutable(argv[0]);
Tcl_Main(argc, argv, Tcl_AppInit);
}
您不应该在 Tcl_AppInit()
函数中创建解释器; Tcl_Main()
已经为您制作了一个。 (如果你正在调用 Tcl_Main()
,你也不需要调用 Tcl_FindExecutable()
;那是为你做的。OTOH,调用两次几乎无害。)
我正在努力在我的应用程序中嵌入一个 TCL 解释器,如果我将一个 Tcl 脚本添加到命令行,我的命令就会被执行并运行。因此,如果我有一个 *.tcl
脚本和一个像 my_command 1
这样的命令,那么 myCmd 过程将在库中执行。然后出现 Tcl 提示符 (%) 这样我就可以交互式地输入更多的命令。如果我再次输入命令,即使命令已经创建,也无法识别命令。
我的代码结构如下。在名为 My.so
的库中,我有这些函数。
int myCmd(ClientData store, Tcl_Interp *interp, int objc, Tcl_Obj * CONST *objv) {
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "my");
return TCL_ERROR;
}
val = Tcl_GetStringFromObj(objv[0], &valLen);
// ...
return TCL_OK;
}
int My_Init(Tcl_Interp *interp) {
Tcl_CreateObjCommand(interp, "my_command", myCmd, (ClientData) NULL, NULL);
// ...
if (inFile != NULL)
Tcl_EvalFile(interp, inFile);
// ...
return TCL_OK;
}
在 main.cpp 我有 ...
int Tcl_AppInit(Tcl_Interp *interp)
{
// ...
interp = Tcl_CreateInterp();
if (interp == NULL)
return TCL_ERROR;
if (Tcl_Init(interp) == TCL_ERROR)
return TCL_ERROR;
if (My_Init(interp) == TCL_ERROR)
return TCL_ERROR;
return TCL_OK;
}
int main(int argc, char* argv[]) {
Tcl_FindExecutable(argv[0]);
Tcl_Main(argc, argv, Tcl_AppInit);
}
您不应该在 Tcl_AppInit()
函数中创建解释器; Tcl_Main()
已经为您制作了一个。 (如果你正在调用 Tcl_Main()
,你也不需要调用 Tcl_FindExecutable()
;那是为你做的。OTOH,调用两次几乎无害。)