如何使嵌入式 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,调用两次几乎无害。)