如何正确重命名c中定义的tcl命令

问题描述 投票:0回答:1

我在c++中定义了一个tcl命令

Tcl_CreateObjCommand(interp, "myproc", myproc_func, nullptr, nullptr);

在tclsh

% rename myproc newproc

C 代码

myproc_func(ClientData clientData,Tcl_Interp *interp,int objc,Tcl_Obj *const objv[])

跑步的这一刻

% newproc

它会调用myproc的函数,即myproc_func,但是此时myproc_func的objv[0]->bytes对应的名字是“newproc”,这导致我无法找到名为newproc的函数名对应的函数。

是否可以将重命名后的命令映射到tcl中之前的命令?

tcl tclsh
1个回答
0
投票

在Tcl中,一旦使用rename命令更改过程或命令的名称,就无法直接将新名称重新映射回命令的原始名称。重命名命令有效地更改了解释器命名空间中命令的名称,并且它不会创建从新名称到旧名称的新映射。

在您的场景中,您最初使用 C++ 代码注册了一个名为“myproc”的命令,然后使用 rename 将其更改为“newproc”。重命名后,您无法在 Tcl 中直接将“newproc”映射回“myproc”。

但是,您可以通过创建调用重命名命令的包装程序或别名来解决此问题。具体方法如下:

proc myproc_wrapper {args} {
    # You can perform any pre-processing here if needed
    # ...

    # Call the renamed command (newproc)
    uplevel newproc $args

    # You can perform any post-processing here if needed
    # ...
}

# Now, when you call myproc_wrapper, it will call newproc

在上面的代码中,我们定义了一个 myproc_wrapper 过程,它接受任意数量的参数 (args),然后使用 uplevel 使用这些参数执行重命名的命令“newproc”。您可以根据需要在包装器中添加任何预处理或后处理。

这样就可以有效实现调用原来的“myproc”的行为,即使它被重命名为“newproc”。

请告诉我这是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.